如何在SQL Server触发器中获取更新列的列表?

时间:2009-05-27 13:36:05

标签: sql-server-2005 triggers

我想知道哪些列在更新操作期间更新操作在第一个scaaning书籍上的triger看起来像COLUMNS_UPDATED是完美的解决方案但这个函数实际上不检查值是否已更改,它只检查哪些列选中在更新条款中,任何人都有其他建议吗?

5 个答案:

答案 0 :(得分:9)

我们可以使用Update函数来查找特定列是否已更新:

IF UPDATE(ColumnName)

有关详细信息,请参阅此链接:http://msdn.microsoft.com/en-us/library/ms187326.aspx

答案 1 :(得分:8)

检查值是否已更改的唯一方法是比较触发器中DELETED和INSERTED虚拟表中的值。 SQL在更新到新值之前不会检查现有值,它会愉快地在顶部写一个新的相同值 - 换句话说,它会接受您的更新并跟踪更新而不是实际更改。

答案 2 :(得分:4)

正如其他人发布的那样,您需要查询INSERTED和DELETED。另一个有用的建议可能是你只能通过使用EXCEPT运算符来获取已更改值的行(并丢弃未更改的行) - 如下所示:

SELECT * FROM Inserted
EXCEPT
SELECT * FROM Deleted

答案 3 :(得分:0)

我能想到的唯一方法是你可以比较DELETED和INSERTED中的值来查看哪些列已经改变。

虽然看起来不是特别优雅的解决方案。

答案 4 :(得分:0)

我问this same question

之前的海报是正确的 - 如果不直接比较这些值,就无法确定数据是否实际发生了变化。但是,有几种方法可以执行此类检查,具体取决于您在触发器中尝试执行的操作。我的问题在关于这些不同机制及其权衡的答案中有一些很好的建议。