触发特定列已更改的行
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
inserted
和 deleted
伪表,看看值是否不同(不要忘记处理 NULL
s 太)。
【参考方案1】:
您需要比较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
【讨论】:
正是我想要的!非常感谢!以上是关于触发特定列已更改的行的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Sqlite 数据库中的特定数据上更改 Listview 中的行颜色