2010-11-06 203 views
6

無論何時在主表「Table1」中發生插入,更新或刪除操作,我都希望在審計表中插入行 - - 哪一列更改/插入無關緊要。我也想在插入,更新或刪除時添加I,U或D.對於插入和刪除,我檢查插入和刪除表中是否存在行。什麼是最好的方式來更新。插入,更新,刪除的觸發器

我的插入代碼,並刪除是:

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 

請幫助!

回答

5

對於更新,行的原始值將被添加到刪除的表中,並且該行的新值將被添加到插入的表中。因此,識別插入,刪除和更新,你會做以下

  • 插件 - 從插入取得的行不在刪除
  • 刪除 - 已刪除未在插入得到的行。
  • 更新 - 獲取在兩種插入行和刪除
+0

謝謝!也會嘗試AutoAudit。 – 2010-11-07 00:32:52

4

您是否考慮使用AutoAudit

AutoAudit是SQL Server(2005,2008) 代碼生成工具,創建審計 線索觸發與:

  • 創,CreatedBy,修改,ModifiedBy和RowVersion (增加INT)表列
  • 插入事件記錄到審覈表
  • 更新新舊值記錄到審計表
  • 刪除日誌一LL最終值給審計tbale
  • 視圖來重建被刪除的行
  • UDF重構行歷史
  • 架構審計觸發追蹤模式更改
  • 重新代碼一族觸發器時ALTER TABLE更改表
5

下面是ApexSQL Audit

這不是一個便宜的工具,但你也許可以用它在試用模式,以產生觸發的例子把事做好。

注意INSERT INTO dbo.AUDIT_LOG_DATA部分,並對要審覈的每一列重複該操作。

在後臺有兩個表格用於存儲數據和多個存儲過程,但這會讓您朝着正確的方向前進。

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