【问题标题】:Trigger for insert, update, delete插入、更新、删除触发器
【发布时间】:2011-05-05 22:04:08
【问题描述】:

每当主表“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

请帮忙!

【问题讨论】:

    标签: sql-server triggers audit


    【解决方案1】:

    您是否考虑过使用AutoAudit

    AutoAudit 是一个 SQL Server(2005、2008) 创建审计的 Code-Gen 实用程序 跟踪触发器:

    • Created、CreatedBy、Modified、ModifiedBy 和 RowVersion (递增 INT)列到表
    • 插入记录到审计表的事件
    • 更新记录到审计表的新旧值
    • 删除所有最终值到审计数据库的日志
    • 视图重建已删除的行
    • UDF 重建行历史记录
    • 架构审计触发器跟踪架构更改
    • Alter Table 更改表时触发 Re-code-gens

    【讨论】:

      【解决方案2】:

      对于更新,该行的原始值将被添加到已删除的表中,该行的新值将被添加到插入的表中。因此,要识别插入、删除和更新,您需要执行以下操作

      • 插入 - 从插入中获取未删除的行
      • 删除 - 从已删除中获取未插入的行。
      • 更新 - 获取插入和删除的行

      【讨论】:

      • 谢谢!也会尝试 AutoAudit。
      【解决方案3】:

      下面是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),
          --@TABLE_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
      

      【讨论】:

        猜你喜欢
        • 2011-02-27
        • 2015-04-26
        • 2012-09-19
        • 2011-11-25
        • 2011-01-15
        • 2010-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多