触发更改特定列的行

问题描述 投票:0回答:1

我想在 SQL Server 中找到一种方法,如何更新某些特定属性已更改的行。简单的例子,我想在所有行中设置

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
已更新。所以如果我有初始表:

身份证 关键属性 其他财产 旗帜
1 100 红色 错误
2 200 蓝色 错误
3 300 黑色 错误

更新如下:

身份证 关键属性 其他财产 旗帜
1 1000 红色 真实
2 200 蓝色 错误
3 300 白色 真实

因此,即使第三行中的标志也被更新,因为有另一个更新并且该行出现在

inserted
逻辑表中。

有没有办法将

inserted
表中的行与该特定行上的
UPDATE()
条件相匹配?将条件放在 WHERE 语句中会得到相同的结果。

sql sql-server t-sql triggers
1个回答
6
投票

您需要比较

inserted
deleted
表,通过主键连接,并验证结果是否不同。

请注意,

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
© www.soinside.com 2019 - 2024. All rights reserved.