2017-04-06 101 views
0

我想在這個問題上實現的是,如果我在我的表格中進行了任何更新/刪除/插入操作,它應該將該記錄插入表格中的1個日誌用途如何獲得在觸發器中執行的動作

我有1個表作爲測試。假設如果我在我的表測試中插入下面的行,它應該引發觸發器,在我的另一個表中插入一行是日誌

測試

Id | Name | Location   
1 | Test | America 

日誌

ID | updatetime    | Action  
----------------------------------------------------------  
1 | 2017-04-06 16:51:18.190 | Insert 

同樣,如果我刪除或更新任何行動下它應該分別刪除或更新

ID | updatetime    | Action  
----------------------------------------------------------  
1 | 2017-04-06 16:51:18.190 | Insert 
1 | 2017-04-06 16:51:18.190 | Delete 

我創建了一個單觸發

create trigger abc 
on test 
after insert, update, delete 
as 
begin 
    declare @id int 

    select @id = i.id from inserted i 

    insert into log values (@id, GETDATE()) 
end 

從上述觸發我能夠獲得ID和錄入,可是如何才能讓行動柱像已執行什麼動作如何實現這一點。任何人都可以有一個線索

+0

你觸發了** **主要中的缺陷,你似乎認爲它會被稱爲**每行一次** - 這是**不是**的情況。觸發器將在每個語句**中觸發一次**,因此如果您的語句影響25行,您將觸發**觸發**一次,但是隨後插入的和/或刪除的僞表格將分別包含25個行。您的代碼在這25行中選擇哪一個? 'SELECT @id = i.id FROM Inserted i' - 這是非確定性的。你需要重寫你的觸發器來考慮這個問題! –

回答

2

可以用於確定哪些行動創建下一個方法發生了: -

DECLARE @Action as char(1); 
    SET @Action = (CASE WHEN EXISTS(SELECT * FROM INSERTED) 
         AND EXISTS(SELECT * FROM DELETED) 
         THEN 'U' -- Set Action to Updated. 
         WHEN EXISTS(SELECT * FROM INSERTED) 
         THEN 'I' -- Set Action to Insert. 
         WHEN EXISTS(SELECT * FROM DELETED) 
         THEN 'D' -- Set Action to Deleted. 
        END) 

-- For Getting the ID 
if @Action = 'D' 
select @id=i.id from DELETED i 
else -- Insert or Update 
select @id=i.id from INSERTED i 
+0

嗨艾哈邁德你的代碼是優秀的,但我有1個問題,當我在測試表上運行刪除查詢時,在我的日誌表中創建條目,但在ID列中顯示爲NULL –

+0

@RedDevil,因爲您正在選擇表單'插入',請從'deleted'中選擇。 –

+0

但是,如果我嘗試插入或更新,然後其作爲NULL –