2010-07-11 66 views
1

我寫了一個更新觸發器,它執行可能調用自身的更新(這是我想要的行爲)。如何編寫遞歸觸發器

不幸的是,觸發器沒有調用自己,我不明白爲什麼。這個觸發器只是簡單地改變任何子記錄的值(基於父鍵),然後我期望在那個孩子被更新後觸發器應該再次被觸發,並且該孩子的任何子記錄被更新等等。

我可以手動運行相同的更新觸發器成功完成,並按照我的預期設置子記錄。

我已經跑版EXEC sp_configure嵌套觸發器「,並已返回

最小:0,最大:1,CONFIG_VALUE:1,run_value:1,所以遞歸似乎開啓。

ALTER TRIGGER [dbo].[DataInstance_Trigger] 
    ON [dbo].[DataInstance] 
AFTER UPDATE 
AS 
BEGIN 
    UPDATE DataInstance 
    SET 
    DataInstance.IsCurrent = i.IsCurrent 
    FROM DataInstance di 
    Inner join DataContainer dc on 
     di.DataContainerId = dc.DataContainerId 
    Inner join Inserted i on 
     dc.ParentDataContainerId = i.DataContainerId  
    WHERE di.IsCurrent != i.IsCurrent    

END 
+0

什麼'EXEC的sp_dboption '數據庫名稱',「遞歸triggers''回報? – 2010-07-11 10:48:23

回答

4

除了服務器範圍的配置,也可以禁用觸發器每個數據庫:

ALTER DATABASE databasename SET RECURSIVE_TRIGGERS ON | OFF 

或通過數據庫屬性 - >選項 - >其他 - >遞歸觸發器已啓用。

如果檢查出來,確認你的第一個觸發器實際上更新了一些東西。我通常使用一個日誌表:

insert into dbo.LogTable (txt) values ('Updated ' + 
    cast(IsNull(@@ROWCOUNT,-1) as varchar(25)) + ' rows.') 

對於調試,你也可以使用打印:

print 'Updated ' + cast(IsNull(@@ROWCOUNT,-1) as varchar(25)) + ' rows.' 
+0

太棒了,我讀了幾篇白皮書,並沒有看到每個數據庫開啓的參考!現在我得到錯誤:超過了最大存儲過程,函數,觸發器或視圖嵌套級別(限制32)。這顯然是不正確的,但取得了進展。 – 2010-07-11 19:44:19