触发特定列已更改的行

Posted

技术标签:

【中文标题】触发特定列已更改的行【英文标题】: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 太)。 【参考方案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

【讨论】:

正是我想要的!非常感谢!

以上是关于触发特定列已更改的行的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Sqlite 数据库中的特定数据上更改 Listview 中的行颜色

仅当特定文件集发生更改时如何触发构建

如果 SharePoint 上的一个特定文件发生更改,则触发操作

Access数据库中如何获取已更改的记录详细信息

每 10 秒更改特定行的颜色

触发/设置数据网格中特定行的样式