触发特定列已更改的行

Trigger for rows where specific column was changed

我想在 SQL 服务器中找到一种方法,如何更新某些特定 属性 已更改的行。简单示例,我想在所有行中设置 Flag = True,其中 KeyProperty 已更改。我创建了 SQL 触发器:

CREATE TRIGGER testTrigger
ON table
AFTER UPDATE
AS
BEGIN
  IF(UPDATE(KeyProperty))
  BEGIN
    UPDATE table
    SET Flag = True
    WHERE EXISTS (SELECT 1 FROM inserted WHERE inserted.Id = table.Id)
  END
END
GO

但是从我假设的结果来看,UPDATE(KeyProperty) 看起来,如果至少有一行 KeyProperty 被更新了。所以如果我有初始 table:

Id KeyProperty OtherProperty Flag
1 100 red False
2 200 blue False
3 300 black False

更新看起来像:

Id KeyProperty OtherProperty Flag
1 1000 red True
2 200 blue False
3 300 white True

所以即使是第三行的 Flag 也被更新了,因为有另一个更新并且该行出现在 inserted 逻辑 table.

有没有一种方法可以匹配来自 inserted table 的行以及该特定行的 UPDATE() 条件?将条件放在 WHERE 语句中得到相同的结果。

您需要比较 inserteddeleted 表,按主键连接,并验证结果是否不同。

请注意,UPDATE() 函数只会告诉您该列是否出现在 UPDATE 中,而不会告诉您该值是否实际发生了变化。

CREATE TRIGGER testTrigger
ON table
AFTER UPDATE
AS

  SET NOCOUNT ON;

  IF(UPDATE(KeyProperty))
  BEGIN
    UPDATE t
    SET Flag = True
    FROM (
        SELECT i.Id, i.KeyProperty
        FROM inserted i
        EXCEPT
        SELECT d.Id, d.KeyProperty
        FROM deleted d
    ) i
    JOIN table t ON t.Id = i.Id
  END

GO