sql server:如何检测更改的行

Can*_*hiu 3 sql sql-server

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

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

最终目标是创建审核跟踪:1)跟踪用户和时间戳2)跟踪插入,删除和REAL更改

任何建议表示赞赏。

cms*_*sjr 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
Run Code Online (Sandbox Code Playgroud)