SQL Server触发器插入,删除&更新在桌子上

时间:2011-06-02 16:42:13

标签: sql-server datatrigger

我有一张表Product和另一张表ProductLog

日志表需要跟踪Product表中的两列。每次在这些列上都有插入,更新或删除时,我需要更新日志表。

我是否需要编写三个单独的触发器,或者一个触发器可以处理这些操作吗?

我还需要知道操作的类型,例如,我需要知道日志表中的条目是否是因为插入或删除或更新。如果有人给我一个很好的例子。

2 个答案:

答案 0 :(得分:24)

您只需要一个触发器

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

您可以根据触发器主体中可用的inserteddeleted表中的记录数来确定触发触发器的DML语句。对于INSERTdeleted为空,对于DELETEinserted为空,UPDATE inserteddeleted均为空空。例如,

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,还有另一个选项可用于跟踪没有触发器的更改。

答案 1 :(得分:7)

或只是

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