2008-10-16 120 views
23

我有一個表上有一個插入觸發器。如果我在存儲過程的一個插入語句中將6000條記錄插入此表中,存儲過程是否會在插入觸發器完成之前返回?Sql觸發器是同步的還是異步的?

只是爲了確保我正確思考,只應該調用觸發器(我知道「調用」不是正確的詞),因爲只有一個插入語句,對嗎?

我的主要問題是:即使觸發器沒有完成,sproc會結束嗎?

回答

19

您的插入觸發器將爲整個插入語句運行一次。這就是爲什麼使用臨時表來查看實際插入的內容非常重要的原因,而不僅僅是選擇最近的單個記錄或類似的東西。

我剛剛測試了插入和更新觸發器,事實上,它們被認爲是sql server插入的一部分。該過程將不會完成,直到觸發器結束。

+1

感謝您提到這一點。我忘記了這一點,並且做了與我將要部署的觸發器類似的情況下我不應該做的事情。我只是重新編寫它來處理插入的整個插入集而不是最新的ID。伊克!可能是一個helluva錯誤。 ;) – 2008-10-16 20:26:06

+0

嗨,高興我可以幫忙! – 2008-10-16 20:28:05

1

觸發器調用不是異步的。對插入過程的每次調用都會導致觸發器被觸發,並且在觸發器結束之前該過程將不會返回。

看看查詢計劃,看看它是如何工作的。您會看到觸發器中的語句將被調用,以便每次調用該過程。

6

觸發器是調用它們的事務的一部分。

觸發器必須注意的一個重要的事情是觸發器會爲每個事務觸發一次(在SQl服務器中最低限度,您應該檢查其他dbs,但即使它將逐行處理,通常一個可憐的想法),所以如果你插入6000條記錄,觸發器將觸發一次6000次。許多人都不知道這一點,並寫入觸發器,就好像它們將一次處理多條記錄插入一條記錄一樣。這是不正確的,你的觸發器必須考慮處理多個記錄插入。

+1

這取決於觸發器定義。在Oracle中,例如我們可以用FOR EACH ROW子句來要求每行的觸發器執行。 http://docs.oracle.com/cd/A97630_01/appdev.920/a96590/adg13trg.htm#431 – 2013-01-23 14:21:33

1

問題是,每當滿足TRIGGER標準時,TRIGGER都會觸發。它在批處理或交易中觸發一次。在TRIGGER上查看我的lesson 101

-1

您應該在插入語句中使用遊標來處理觸發器行。 因爲SQL Server中的觸發器每個語句觸發一次,而不是每行觸發一次。

相關問題