2009-11-06 218 views
1

我在INSERT,UPDATE和DELETE後在SQL Server中創建觸發器。如果觸發器代碼在插入更新或刪除語句上運行,是否有辦法知道觸發器代碼,因爲我需要對每種情況採取不同的行爲,或者我需要爲它們中的每一個創建觸發器。SQL Server觸發器

由於提前,

聖保羅

+0

這對你沒有幫助嗎? – IsmailS 2009-11-06 12:58:12

+1

你好,謝謝你的答案,他們都是正確的,但我想知道是否存在觸發器內的自動標誌,告訴我們在哪個語句正在運行。例如在PostGreSQL中,我們可以使用IF(tg_op ='INSERT')來知道觸發器是否從Insert和Insert運行。非常感謝所有... – Paulo 2009-11-06 17:25:39

回答

1

有邏輯臨時「插入」和「刪除」表,您可以訪問。

如果在這兩個表中有一些行意味着它的更新。

您可以通過選擇查詢「插入」表來獲取新值。

Select * from inserted 

您可以通過查詢「已刪除」表來獲取正在更新的舊值。

Select * from deleted 
3

有數據集稱爲插入或刪除。根據調用觸發器的操作,這些數據集中有數據。對於更新,IIRC,原始數據處於DELETED狀態,新數據處於INSERTED狀態。

請參閱here

1

如果更適合您,可以使用AFTER關鍵字爲每個事件指定單獨的觸發器。

如: -

CREATE TRIGGER FooIns ON TableBar 
AFTER INSERT 

CREATE TRIGGER FooUpd ON TableBar 
AFTER UPDATE 
+0

觸發器是邪惡的,如果我們只能使用一個,我們只能使用一個觸發器。 – silent 2009-11-06 13:30:12

+0

觸發器是邪惡的,伊莫不要使用它們。但是如果你打算使用它們,保持它們分離和組織起來有助於維護 – badbod99 2009-11-06 13:36:13

+0

如果能勝任的開發人員正確使用觸發器並不是壞事。 – HLGEM 2009-11-06 16:38:53

3

如果您需要執行「不同的行爲」,又是什麼,而不是每一個操作觸發試圖只寫1觸發點,?

0

只需使用單獨的觸發器!有人提到觸發器是邪惡的,但如果你開始包含複雜的代碼來嘗試和確定行動(插入/更新/刪除),它們會變得更加邪惡。如果任何人在將來觸發你的觸發器,他們只會質疑WTF他是在想創造不必要的複雜性!

另外值得記住的是,更新可以影響多行,因此當觸發器被觸發時,'刪除''插入'表格可以有很多行!

0

正如devio所說,如果你對INSERT和DELETE做了不同的事情,你可以使用兩個觸發器。只需在CREATE TRIGGER行之後指定FOR INSERT或者FOR DELETE即可。

如果你想使用一個觸發器,那麼,如伊斯梅爾暗示的那樣,你可以檢查在觸發器內給你的臨時「插入」和「刪除」表的值。

如果「deleted」表爲空,則該觸發器由INSERT語句觸發; 如果「已刪除」不爲空,且「已插入」表爲空,則觸發器由DELETE語句觸發。 如果兩者都不爲空,那麼將使用UPDATE語句。