我编写了一个触发器,需要根据行中实际更新的列对表执行一些不同的工作。我使用
完成了此操作IF UPDATE(column-name)
那部分工作正常。然而,事实证明,代码的其他部分通过设置每个值来更新行,无论该值是否实际更改,这会导致触发器触发“已更新”但其值实际上未更改的部分根本不。
由于更改导致此问题的代码可能不是一个选择,除了必须在 INSERTED 和 DELETED 表之间进行比较(在这种情况下 IF UPDATE 毫无意义)之外,是否有更简单的方法来防止这种情况?
最佳答案
IF EXISTS (SELECT *
FROM
INSERTED I JOIN DELETED D ON I.Key = D.Key
WHERE
I.Col <> D.Col)
...
或者使用表变量进行缓存,以避免重复使用I和D。
SELECT
CASE WHEN I.Col1 <> D.Col1 THEN 1 ELSE 0 END AS Col1Diff,
CASE WHEN I.Col2 <> D.Col2 THEN 1 ELSE 0 END AS Col2Diff,
...
FROM
INSERTED I JOIN DELETED D ON I.Key = D.Key
或者结合想法来预先测试所有更改并退出触发器
关于sql-server - TSql 触发器只需要在值已更改的列上触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2007954/