我在INSERT,UPDATE和DELETE後在SQL Server中創建觸發器。如果觸發器代碼在插入更新或刪除語句上運行,是否有辦法知道觸發器代碼,因爲我需要對每種情況採取不同的行爲,或者我需要爲它們中的每一個創建觸發器。SQL Server觸發器
由於提前,
聖保羅
我在INSERT,UPDATE和DELETE後在SQL Server中創建觸發器。如果觸發器代碼在插入更新或刪除語句上運行,是否有辦法知道觸發器代碼,因爲我需要對每種情況採取不同的行爲,或者我需要爲它們中的每一個創建觸發器。SQL Server觸發器
由於提前,
聖保羅
有邏輯臨時「插入」和「刪除」表,您可以訪問。
如果在這兩個表中有一些行意味着它的更新。
您可以通過選擇查詢「插入」表來獲取新值。
Select * from inserted
您可以通過查詢「已刪除」表來獲取正在更新的舊值。
Select * from deleted
有數據集稱爲插入或刪除。根據調用觸發器的操作,這些數據集中有數據。對於更新,IIRC,原始數據處於DELETED狀態,新數據處於INSERTED狀態。
請參閱here。
如果更適合您,可以使用AFTER關鍵字爲每個事件指定單獨的觸發器。
如: -
CREATE TRIGGER FooIns ON TableBar
AFTER INSERT
CREATE TRIGGER FooUpd ON TableBar
AFTER UPDATE
如果您需要執行「不同的行爲」,又是什麼,而不是每一個操作觸發試圖只寫1觸發點,?
只需使用單獨的觸發器!有人提到觸發器是邪惡的,但如果你開始包含複雜的代碼來嘗試和確定行動(插入/更新/刪除),它們會變得更加邪惡。如果任何人在將來觸發你的觸發器,他們只會質疑WTF他是在想創造不必要的複雜性!
另外值得記住的是,更新可以影響多行,因此當觸發器被觸發時,'刪除''插入'表格可以有很多行!
正如devio所說,如果你對INSERT和DELETE做了不同的事情,你可以使用兩個觸發器。只需在CREATE TRIGGER行之後指定FOR INSERT或者FOR DELETE即可。
如果你想使用一個觸發器,那麼,如伊斯梅爾暗示的那樣,你可以檢查在觸發器內給你的臨時「插入」和「刪除」表的值。
如果「deleted」表爲空,則該觸發器由INSERT語句觸發; 如果「已刪除」不爲空,且「已插入」表爲空,則觸發器由DELETE語句觸發。 如果兩者都不爲空,那麼將使用UPDATE語句。
這對你沒有幫助嗎? – IsmailS 2009-11-06 12:58:12
你好,謝謝你的答案,他們都是正確的,但我想知道是否存在觸發器內的自動標誌,告訴我們在哪個語句正在運行。例如在PostGreSQL中,我們可以使用IF(tg_op ='INSERT')來知道觸發器是否從Insert和Insert運行。非常感謝所有... – Paulo 2009-11-06 17:25:39