触发特定列已更改的行
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 语句中得到相同的结果。
您需要比较 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
我想在 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 语句中得到相同的结果。
您需要比较 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