2009-08-26 51 views
0

我有一個表,我們打電話是[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,我必須指定列)。

+0

最初的INSERT/UPDATE是如何執行的?你必須使用觸發器嗎?我想問的原因是整個事件過程可以封裝在一個存儲過程中(根本不需要觸發器)。 – 2009-08-26 22:30:12

回答

3

你是否試過IF UPDATE(LastModified)指令?

CREATE TRIGGER XYZ ON MYTABLE 
FOR INSERT, UPDATE 
AS 
BEGIN 
IF UPDATE(LastModified) 
    RETURN 
ELSE 
    BEGIN 
    UPDATE MYTABLE SET LastModified = GETDATE() 
    FROM MYTABLE INNER JOIN INSERTED ON MYTABLE.ID = INSERTED.ID 
    EXEC TheStoreProc 
    END 
END; 
+0

這解決了EXEC在工作流的錯誤一方被調用的問題,但實際上並沒有改變LastModified,它需要通過觸發器來更新。 – richardtallent 2009-08-27 06:12:08

+0

修復了腳本,現在更新表,然後執行腳本。觸發器將被「觸發」兩次,但內部執行將立即結束。 – Rodrigo 2009-08-27 07:21:18

+0

羅德里戈 - 謝謝,但如果這樣做,EXEC「看到」LastModified會改變嗎?它會看到它是有道理的,除非觸發器在某種隱含的事務中工作。 – richardtallent 2009-08-27 14:27:23

0

我不確定我瞭解您所描述的流程。難道是:

  1. 記錄更新
  2. 更新觸發PROC叫
  3. 觸發更新上次更改場
  4. 觸發器調用另一個PROC

應該做工精細,只要「另一個proc「不會更新同一個表, 這會再次觸發觸發器。

如果「另一個PROC」 再次更新表,你可能搬完更新 到觸發調用「另一個PROC」之前。

這有幫助嗎?

+0

不幸的是,這正是發生的情況。 SP將不會*更新與「原始」觸發器相同的記錄,但會更新其他記錄,這將再次調用觸發器。所以,雖然沒有遞歸的機會,但它仍然是一個混亂的小步驟循環。不幸的是,將SP代碼移到觸發器中並不好(因爲SP隻影響其他*記錄,INSTEAD OF觸發器不會減少一步遞歸),並且會使代碼更易於維護(觸發幾個表格調用相同的SP)。我寧願使用視圖,但這次不要打電話。 – richardtallent 2009-08-27 06:09:47

相關問題