SQL Server表的插入、删除和更新触发器

9
我有一个名为Product的表和另一个名为ProductLog的表。
日志表需要跟踪Product表中的两列。每次对这些列进行插入、更新或删除操作时,我都需要更新日志表。
我需要编写三个单独的触发器吗?还是可以使用一个触发器处理这些操作?
我还需要知道操作的类型,例如,我需要知道日志表中的条目是由于插入、删除还是更新。如果有人能给我一个例子,那就太好了。
2个回答

24

你只需要一个触发器

CREATE TRIGGER [ProductAfter] ON [Product] AFTER INSERT, UPDATE, DELETE

您可以根据触发器内的inserteddeleted表中记录的数量来确定触发哪个DML语句。对于INSERTdeleted为空,对于DELETEinserted为空,对于UPDATEinserteddeleted都不为空。例如,

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;

此外,请查看跟踪数据更改,还有另一种不需要触发器的跟踪更改选项。


8
或者只是
DECLARE @type CHAR(1)=
    case when not exists(SELECT * FROM inserted)
        then 'D'
    when exists(SELECT * FROM deleted)
        then 'U'
    else
        'I'
    end

我有同样的问题,有人可以帮助我吗?请查看以下链接http://stackoverflow.com/questions/26043106/how-to-determine-if-insert-or-update/26043654#26043654。 - Ramesh S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接