2010-07-11 56 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