sql-server - TSql 触发器只需要在值已更改的列上触发

标签 sql-server tsql triggers

我编写了一个触发器,需要根据行中实际更新的列对表执行一些不同的工作。我使用

完成了此操作
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/

相关文章:

wpf - 触发时无法显示下划线

sql - 如何得到准确的总数

sql - 如何使用 SQL 按最后日期查找可能的反向重复项?

sql-server - SQL Server 输出子句转换为标量变量

sql - 修剪空白而不影响内部空白

Mysql触发器约束检查

sql-server - 如何在 SQL Server 中将星期一设置为一周的第一天

c# - 对于 ADO,使用 SqlDataAdapter.FillSchema 清除@ReturnValues 和其他标记为输出的存储过程参数

sql - 连接海量 CTE 表(13,000,000 行以上)性能问题

mysql - 处理 ON INSERT 触发器时如何锁定 innodb 表?