如何编写递归触发器

时间:2010-07-11 10:39:50

标签: sql-server

我编写了一个更新触发器,它执行可能会调用自身的更新(这是我想要的行为)。

不幸的是,触发器不会调用自己,我不明白为什么。此触发器只是更改任何子记录的值(基于父键),然后我希望在更新该子项时,应再次触发该触发器,并更新该子项的任何子记录等,等等。 / p>

我可以手动运行相同的更新,触发器成功完成,子记录按我的预期设置。

我已经运行了EXEC sp_configure'嵌套触发器'并且已经返回

minimum:0,maximum: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

1 个答案:

答案 0 :(得分: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:

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