2011-06-02 96 views
8

我有一个表Product和另一个表ProductLog插入,删除和更新表上的SQL Server触发器

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

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

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

回答

24

你只需要一个触发

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

您可以确定哪些DML语句都根据记录数扳机触发体内可inserteddeleted表。对于INSERTdeleted为空,对于DELETE,inserted为空,对于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一看,有一个跟踪变化,而不触发另一种选择。

6

或只是

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

我有同样的问题,有的人能帮助我。请参阅以下链接http://stackoverflow.com/questions/26043106/how-to-determine-if-insert-or-update/26043654#26043654 – Prathyush 2014-09-25 17:07:38