3

我想创建一个触发器来检测 SQL Server 中的行是否已更改。我目前的方法是遍历每个字段,应用 COLUMNS_UPDATED() 来检测是否调用了 UPDATE,然后最后比较插入和删除中同一行(由 PK 标识)的该字段的值。

我想消除程序中的循环。可能我可以将插入和删除的内容转储到一个表中,对所有列进行分组,然后选择 count=2 的行。这些行将被视为未更改。

最终目标是创建审计跟踪:1) 跟踪用户和时间戳 2) 跟踪插入、删除和真实更改

任何建议表示赞赏。

4

1 回答 1

5

您可以使用BINARY_CHECKSUM来比较插入和删除表之间的整个行,而不是循环,然后采取相应的行动。

例子

Create table SomeTable(id int, value varchar(100))

Create table SomeAudit(id int, Oldvalue varchar(100), NewValue varchar(100))


Create trigger tr_SomTrigger  on SomeTable for Update 
as
begin
        insert into SomeAudit 
        (Id, OldValue, NewValue)
        select i.Id, d.Value, i.Value 
        from
        (
            Select Id, Value, Binary_CheckSum(*) Version from Inserted
        ) i
        inner join 
        (
            Select Id, Value, Binary_CheckSum(*) Version from Deleted
        ) d
        on i.Id = d.Id and i.Version <> d.Version


End 

Insert into sometable values (1, 'this')
Update SomeTable set Value = 'That'
Select * from SomeAudit
于 2012-09-05T17:00:43.730 回答