如何调试递归触发器

时间:2010-07-11 21:57:46

标签: sql sql-server

我有一个递归触发器,它似乎完全按照我想要的方式进行,没有递归,但是当我转向递归时,我得到错误:“超出最大存储过程,函数,触发器或视图嵌套级别(限制) 32)“

这不应该发生,因为我希望有两个或三个级别的嵌套,所以我需要调试触发器并确定究竟发生了什么。我添加了一个打印声明,但这不起作用......

如何调试递归触发器?

ALTER TRIGGER [dbo].[DataInstance2_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     

    declare @x int
    SET @X = (select max(DataContainerId) from Inserted)
    print @X

END

1 个答案:

答案 0 :(得分:3)

你可以在触发器中包含一个SELECT语句(我刚试过这个 - 在触发器UPDATE之前尝试SELECT * FROM DataInstance)。

我已经重新解决了这个问题 - 即使没有更新行,触发器中的UPDATE也会导致触发器再次触发。一个合适的解决方法是将UPDATE语句包装在IF (SELECT COUNT(*) FROM INSERTED) <> 0 BEGIN ... END块中的触发器中。