我创建了一个触发器,用于在审计表中插入已更改列(插入,更新,删除)的列名。
我更新列时遇到问题。假设我有一个表dbo.TABLE列COL1,COL2,COL3。
此外,假设我只有一行:
COL1 | COL2 | COL3
---------------------------
value1 | value2 | value3
如果我的更新语句如下所示:
Update dbo.TABLE set COL1 = 'test1', COL2 = 'test2';
在我的审核表中将插入:
UPDATED
-------
COL1, COL2
这没关系,但是我可以说我有相同的表dbo.TABLE和第一个值(value1,value2,value3)。
如果我的更新语句如下所示:
Update dbo.TABLE set COL1 = 'value1', COL2 = 'test2';
在我的审计表中,将按上述方式插入相同的结果(COL1,COL2)。
如何更改触发器以便只插入更新列(COL2)? 我需要某种语句,在更新之前检查列的值。
我的触发器太大了,无法将所有内容放在此处,因此我只会将返回列的部分代码更新。
SELECT @idTable = T.id
FROM sysobjects P JOIN sysobjects T ON P.parent_obj = T.id
WHERE P.id = @@procid
SELECT @Columns_Updated = ISNULL(@Columns_Updated + ', ', '') + name
FROM syscolumns t
WHERE id = @idTable
AND CONVERT(VARBINARY,REVERSE(COLUMNS_UPDATED())) & POWER(CONVERT(BIGINT, 2), colorder - 1) > 0
这是我从中获取代码的原始帖子: SQL Server Update Trigger, Get Only modified fields
答案 0 :(得分:0)
如果值相同,您是否可以阻止更新?这将是最好的方法,并允许您使用触发器中的相同代码(更不用说从I / O角度来看效率更高)。
如果驱动更新的前端是一个用户界面,那么我会在其中删除一个日志记录类,以便在使用该数据的数据之前/之后进行记录。
如果做不到这一点,我认为(其他人可能会在这里纠正我)你需要使用CDC(更改数据捕获)来比较旧/新值。