我想知道哪些列在更新操作期间更新操作在第一个scaaning书籍上的triger看起来像COLUMNS_UPDATED是完美的解决方案但这个函数实际上不检查值是否已更改,它只检查哪些列选中在更新条款中,任何人都有其他建议吗?
答案 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)
之前的海报是正确的 - 如果不直接比较这些值,就无法确定数据是否实际发生了变化。但是,有几种方法可以执行此类检查,具体取决于您在触发器中尝试执行的操作。我的问题在关于这些不同机制及其权衡的答案中有一些很好的建议。