2011-06-02 166 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