我想创建一个触发器来检测 SQL Server 中的行是否已更改。我目前的方法是遍历每个字段,应用 COLUMNS_UPDATED() 来检测是否调用了 UPDATE,然后最后比较插入和删除中同一行(由 PK 标识)的该字段的值。
我想消除程序中的循环。可能我可以将插入和删除的内容转储到一个表中,对所有列进行分组,然后选择 count=2 的行。这些行将被视为未更改。
最终目标是创建审计跟踪:1) 跟踪用户和时间戳 2) 跟踪插入、删除和真实更改
任何建议表示赞赏。
我想创建一个触发器来检测 SQL Server 中的行是否已更改。我目前的方法是遍历每个字段,应用 COLUMNS_UPDATED() 来检测是否调用了 UPDATE,然后最后比较插入和删除中同一行(由 PK 标识)的该字段的值。
我想消除程序中的循环。可能我可以将插入和删除的内容转储到一个表中,对所有列进行分组,然后选择 count=2 的行。这些行将被视为未更改。
最终目标是创建审计跟踪:1) 跟踪用户和时间戳 2) 跟踪插入、删除和真实更改
任何建议表示赞赏。
您可以使用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