【发布时间】:2011-09-07 05:32:56
【问题描述】:
我有一张桌子Product 和另一张桌子ProductLog。
日志表需要跟踪Product 表中的两列。每次在这些列上插入、更新或删除时,我都需要更新日志表。
我需要编写三个单独的触发器,还是一个触发器可以处理这些操作?
我还需要知道操作的类型,例如我需要知道日志表中的条目是因为插入、删除还是更新。如果有人能给我一个例子,那就太好了。
【问题讨论】:
我有一张桌子Product 和另一张桌子ProductLog。
日志表需要跟踪Product 表中的两列。每次在这些列上插入、更新或删除时,我都需要更新日志表。
我需要编写三个单独的触发器,还是一个触发器可以处理这些操作?
我还需要知道操作的类型,例如我需要知道日志表中的条目是因为插入、删除还是更新。如果有人能给我一个例子,那就太好了。
【问题讨论】:
你只需要一个触发器
CREATE TRIGGER [ProductAfter] ON [Product] AFTER INSERT, UPDATE, DELETE
您可以根据触发器主体中可用的inserted 和deleted 表中的记录数来确定触发触发器的 DML 语句。对于INSERT,deleted 为空,对于DELETE,inserted 为空,对于UPDATE,inserted 和deleted 都不为空。例如,
IF @@ROWCOUNT = 0 -- exit trigger when zero records affected
BEGIN
RETURN;
END;
DECLARE @type CHAR(1);-- 'U' for update, 'D' for delete, 'I' for insert
IF EXISTS(SELECT * FROM inserted)
BEGIN
IF EXISTS(SELECT * FROM deleted)
BEGIN
SET @type ='U';
END
ELSE
BEGIN
SET @type ='I';
END
END
ELSE
BEGIN
SET @type = 'D';
END;
另外,看看Tracking Data Changes,还有另一个选项可以在没有触发器的情况下跟踪更改。
【讨论】:
或者只是
DECLARE @type CHAR(1)=
case when not exists(SELECT * FROM inserted)
then 'D'
when exists(SELECT * FROM deleted)
then 'U'
else
'I'
end
【讨论】: