2010-11-06 19 views
6

Voglio inserire righe nella tabella di controllo ogni volta che un inserimento, aggiornamento o eliminazione avviene nella tabella principale "Tabella1" - non importa quale colonna è stata modificata/inserita. Voglio anche aggiungere I, U o D su insert, update o delete. Per inserire ed eliminare sto verificando se le righe esistono nella tabella inserita ed eliminata. Qual è il modo migliore per affrontare l'aggiornamento.Trigger per inserimento, aggiornamento, eliminazione

Il mio codice per inserire ed eliminare è:

CREATE TRIGGER [dbo].[tr_Table1_InsertUpdate_Table1History_Insert] 
ON [dbo].[Table1] 
FOR INSERT, DELETE, UPDATE 

AS 
BEGIN 
IF EXISTS(SELECT * FROM Inserted) 
BEGIN 
    INSERT INTO Table1History(...., ModificationType) 
    SELECT ..., 'I' 
    FROM Inserted 
END 


IF EXISTS(SELECT * FROM Deleted) 
BEGIN 
    INSERT INTO Table1History(..., ModificationType) 
    SELECT ..., 'D' 
    FROM Deleted 
END 

END 
GO 

aiuto gentile!

risposta

5

Per gli aggiornamenti, i valori originali per la riga verranno aggiunti alla tabella eliminata e i nuovi valori per la riga verranno aggiunti alla tabella inserita. Così, per identificare gli inserti, eliminazioni e aggiornamenti che si farebbe il seguente

  • Inserti - ottenere le righe da inserire che non sono in cancellato
  • Elimina - ottenere le righe da cancellati che non sono in inserito.
  • aggiornamenti - ottenere le righe che si trovano in entrambi inserted e deleted
+0

Grazie! Proverà anche AutoAudit. –

4

Hai considerato l'utilizzo di AutoAudit?

AutoAudit è uno SQL Server (2005, 2008) di utilità Codice-Gen che crea Audit Trail Trigger con:

  • Creato, CreatedBy, Modified, ModifiedBy, e RowVersion (incremento INT) colonne alla tabella
  • Inserisci evento registrato al tavolo Audit
  • Aggiornamenti vecchi e nuovi valori registrati a Audit tavolo
  • eliminare i registri di un valori finali ll alla revisione tbale
  • al fine di ricostruire le righe eliminate
  • UDF per ricostruire la storia Row
  • Schema Audit trigger per tenere traccia delle modifiche dello schema
  • re-code-gens si innesca quando Alter Table modifica la tabella di
5

Di seguito è un esempio di un trigger generato dal ApexSQL Audit

Non è uno strumento a buon mercato, ma probabilmente è possibile utilizzarlo in modalità di prova per finisci il lavoro.

Notare la parte INSERT INTO dbo.AUDIT_LOG_DATA e ripeterla per ogni colonna che si desidera controllare.

Ci sono due tabelle in background per la memorizzazione dei dati e diverse stored procedure, ma questo ti porterà nella giusta direzione.

CREATE TRIGGER [dbo].[tr_d_AUDIT_TableName] 
ON [dbo].[TableName] 
FOR DELETE 
NOT FOR REPLICATION 
AS 
BEGIN 
DECLARE 
    @IDENTITY_SAVE    varchar(50), 
    @AUDIT_LOG_TRANSACTION_ID  Int, 
    @PRIM_KEY    nvarchar(4000), 
    [email protected]_NAME    nvarchar(4000), 
    @ROWS_COUNT    int 

SET NOCOUNT ON 


Select @ROWS_COUNT=count(*) from deleted 
Set @IDENTITY_SAVE = CAST(IsNull(@@IDENTITY,1) AS varchar(50)) 

INSERT 
INTO dbo.AUDIT_LOG_TRANSACTIONS 
(
    TABLE_NAME, 
    TABLE_SCHEMA, 
    AUDIT_ACTION_ID, 
    HOST_NAME, 
    APP_NAME, 
    MODIFIED_BY, 
    MODIFIED_DATE, 
    AFFECTED_ROWS, 
    [DATABASE] 
) 
values(
    'TableName', 
    'dbo', 
    3, -- ACTION ID For DELETE 
    CASE 
     WHEN LEN(HOST_NAME()) < 1 THEN ' ' 
     ELSE HOST_NAME() 
    END, 
    CASE 
     WHEN LEN(APP_NAME()) < 1 THEN ' ' 
     ELSE APP_NAME() 
    END, 
    SUSER_SNAME(), 
    GETDATE(), 
    @ROWS_COUNT, 
    'DatabaseName' 
) 


Set @AUDIT_LOG_TRANSACTION_ID = SCOPE_IDENTITY() 

INSERT 
INTO dbo.AUDIT_LOG_DATA 
(
    AUDIT_LOG_TRANSACTION_ID, 
    PRIMARY_KEY_DATA, 
    COL_NAME, 
    OLD_VALUE_LONG, 
    DATA_TYPE 
    , KEY1 
) 
SELECT 
    @AUDIT_LOG_TRANSACTION_ID, 
    convert(nvarchar(1500), IsNull('[Order_ID]='+CONVERT(nvarchar(4000), OLD.[Order_ID], 0), '[Order_ID] Is Null')), 
    'Order_ID', 
    CONVERT(nvarchar(4000), OLD.[Order_ID], 0), 
    'A' 
    , CONVERT(nvarchar(500), CONVERT(nvarchar(4000), OLD.[Order_ID], 0)) 
FROM deleted OLD 
WHERE 
    OLD.[Order_ID] Is Not Null 
END 
Problemi correlati