我有一個表,我們打電話是[MYTABLE],用進行INSERT,更新觸發器。T-SQL觸發器在調用其他代碼之前發生變化
該觸發器需要執行一個存儲過程,該存儲過程將根據對[MYTABLE]所做的更改進行一些工作。我無法將存儲過程的代碼移動到觸發器中。
到目前爲止,一切都很好...因爲觸發的更改後執行,存儲過程有沒有需要訪問[插入]或[刪除]元表。
然而...扳機需要改變一個附加字段(一個[上次更改] SMALLDATETIME),從而所存儲的程序可以在其處理使用該數據。這是而不是因此存儲過程可以看到插入/更新的內容......該過程可能會根據觸發它的更新中未包含的其他記錄執行許多操作。
問題是,如果我的觸發器更改[上次更改],即要麼做什麼都(如果我遞歸觸發器關閉),否則將最終調用存儲過程兩次 - 一次是因爲的原始觸發改變,再次因爲我的修改[LastModified]。
我怎樣才能解決這個如此(一)[上次更改]獲取與每一個變化和更新的(b)該存儲過程只調用後訪問的[上次更改]新值?
我有兩個想法,我在想,但他們聞到有趣,所以我寧願看看是否有更直接的解決方案。
編輯:
好吧,這裏是解決方案,我到目前爲止,也許這將有助於討論:
1.使用兩個觸發器。其中一個「INSTEAD OF」觸發器將處理用戶對記錄的更新並將更改LastModified,但如果更新快速返回從 SP(它可以根據哪些列被修改)可以快速返回。另一個將是一個「AFTER」觸發器,它將調用EXEC。此觸發器通過INSTEAD OF觸發器獲取已應用的LastModified列的更新。至少我希望這是如何運作的。
2.將ModifiedDate移動到另一個表中。這樣,我可以有一個AFTER INSERT/UPDATE觸發器,如果用戶啓動INSERT/UPDATE,則只有,將審計記錄添加到另一個表並調用SP。然後,SP將修改其他記錄,這會導致觸發器再次觸發,但它會很快識別出情況並返回而不做更多工作。
第一個解決方案的缺點是我必須在觸發器中保留一個列表列表,因此INSTEAD OF update實際上是做了預期的工作(因爲我在列表中添加了一列,ModifiedDate,所以我不能只需插入插入的tbl,我必須指定列)。
最初的INSERT/UPDATE是如何執行的?你必須使用觸發器嗎?我想問的原因是整個事件過程可以封裝在一個存儲過程中(根本不需要觸發器)。 – 2009-08-26 22:30:12