如何确定某些东西在UPDATE触发器有什么改变? 例如,我有表被点名的人只有一个包含价值“迈克”列名。 如果我运行
UPDATE person SET NAME = 'Mike'
我如何才能通过更新触发器确定没有发生什么变化? 我知道UPDATE(COL)语句,但我不想遍历列。 是否有任何其他的方式来做到这一点?
如何确定某些东西在UPDATE触发器有什么改变? 例如,我有表被点名的人只有一个包含价值“迈克”列名。 如果我运行
UPDATE person SET NAME = 'Mike'
我如何才能通过更新触发器确定没有发生什么变化? 我知道UPDATE(COL)语句,但我不想遍历列。 是否有任何其他的方式来做到这一点?
仅仅更新(专栏)指出,列参加了更新,但并不表明它的价值发生了变化。 例如,
update Person SET Name = Name
在更新(名称)产生真实的,即使名称没有在任何行改变。
要检查是否有新的值从旧的不同,你会使用不同的 ,因为除了会移除顶部组中存在的底组行。 由于人表可能有主键没有删除更改的项目,有一个对应的已删除的危险。 但是,如果你决定改变*
有趣列的列表,一定要包括主键。
insert into logTable (ID)
select a.ID
from
(
select * from Inserted
except
select * from Deleted
) a
好处是,这个工程的刀片也因为删除的将是空的,并从插入的所有行会退还。
参照阿里昂的回答以上:
一定要通过自己的主键从加入,因为inserted和deleted表可能包含多个记录,其中,选择时比较记录 - 如果忽略 - 可能会导致两个都错了查询结果,并在DB的性能造成负面影响。
-- Anrion's answer - slightly modified
CREATE TRIGGER UpdatedTriggerName
ON person -- table name
AFTER UPDATE
AS
IF EXISTS (
SELECT
*
FROM
INSERTED I
JOIN
DELETED D
-- make sure to compare inserted with (same) deleted person
ON D.ID = I.ID
AND D.NAME <> I.NAME -- only persons with changed name
)
print 'something'
GO