触发插入,更新,删除

时间:2010-11-06 01:58:53

标签: sql-server triggers audit

我想在主表“Table1”中进行插入,更新或删除时将行插入到审计表中 - 无论哪个列被更改/插入都无关紧要。我还想在插入,更新或删除时添加I,U或D.对于插入和删除,我正在检查inserted和deleted表中是否存在行。什么是接近更新的最佳方式。

我的插入和删除代码是:

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

请帮忙!

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分: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),
    --@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

答案 2 :(得分:4)

您是否考虑过使用AutoAudit

  

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

     
      
  • Created,CreatedBy,Modified,ModifiedBy和RowVersion   (递增INT)列到表
  •   
  • 将事件记录到审核表
  •   
  • 更新记录到审核表的新旧值
  •   
  • 删除将所有最终值记录到Audit tbale
  •   
  • 查看重建已删除的行
  •   
  • UDF重建行历史
  •   
  • 用于跟踪架构更改的架构审核触发器
  •   
  • 当Alter Table更改表格时重新编码gens触发
  •