仅插入更新的列名称的触发器

时间:2014-02-24 18:04:39

标签: sql-server triggers sql-update

我创建了一个触发器,用于在审计表中插入已更改列(插入,更新,删除)的列名。

我更新列时遇到问题。假设我有一个表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

1 个答案:

答案 0 :(得分:0)

如果值相同,您是否可以阻止更新?这将是最好的方法,并允许您使用触发器中的相同代码(更不用说从I / O角度来看效率更高)。

如果驱动更新的前端是一个用户界面,那么我会在其中删除一个日志记录类,以便在使用该数据的数据之前/之后进行记录。

如果做不到这一点,我认为(其他人可能会在这里纠正我)你需要使用CDC(更改数据捕获)来比较旧/新值。