在SQL Server 2008 中,tblMedia 表[dbo].[tblMediaAfterInsertOrUpdate] 上的觸發器無意中導致遞歸行為。當觸發器既被觸發又隨後觸發自身時,就會出現此行為。
要了解該問題,讓我們檢查觸發器:
ALTER TRIGGER [dbo].[tblMediaAfterInsertOrUpdate] ON [dbo].[tblMedia] BEFORE INSERT, UPDATE AS BEGIN ...
插入或更新後:觸發器在提交插入或更新之前執行。
潛在遞歸:觸發器內的更新語句嘗試修改 tblMedia 表。此修改可能會再次觸發相同的觸發器,從而導致無限循環。
防止遞歸:為了防止這種遞歸行為,我們可以使用 TRIGGER_NESTLEVEL() 函數來檢查巢狀層級觸發器的。如果巢狀等級大於 1,則觸發器正在被另一個觸發器調用,應跳過。
ALTER TRIGGER [dbo].[tblMediaAfterInsertOrUpdate] ON [dbo].[tblMedia] BEFORE INSERT, UPDATE AS BEGIN IF TRIGGER_NESTLEVEL() <= 1 /* Prevent recursion */ BEGIN ... END END
說明:
透過將此檢查合併到觸發器中,我們可以防止它無限遞歸,並確保只執行一次必要的資料修改。
以上是如何防止 SQL Server 中的遞迴觸發器?的詳細內容。更多資訊請關注PHP中文網其他相關文章!