【问题标题】:Trigger for rows where specific column was changed触发特定列已更改的行
【发布时间】:2021-11-03 08:24:35
【问题描述】:

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

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逻辑表中。

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

【问题讨论】:

  • 您需要 JOIN inserteddeleted 伪表,看看值是否不同(不要忘记处理 NULLs 太)。

标签: sql sql-server tsql triggers


【解决方案1】:

您需要比较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

【讨论】:

  • 正是我想要的!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-29
  • 2017-09-20
  • 2017-04-08
相关资源
最近更新 更多