【问题标题】:Can this trigger result in infinite recursion in SQL Server 2008 R2此触发器是否会导致 SQL Server 2008 R2 中的无限递归
【发布时间】:2014-07-17 15:18:23
【问题描述】:

我有一个 SQL Server 2008 R2 数据库,其中有一个名为“xyz”的表。该表具有以下触发器,其中我通过从同一服务器上的另一个数据库获取插入的记录来填充用户名。

我的问题是:这个触发器是否会导致执行相同的触发器,从而导致不必要的递归?我在测试中没有发现任何这样的东西,但只是想确定一下,因为我对触发器的世界完全陌生。

ALTER TRIGGER [dbo].[trig_UpdateProduct]
ON [dbo].[xyz]
AFTER INSERT
AS
BEGIN

  SET NOCOUNT ON;

  UPDATE xyz
  SET UserName = pu.UserName
  FROM INSERTED i
  INNER JOIN SampleDB.dbo.ProductUser pu
    ON i.ProductId = pu.ProductId
  WHERE xyz.ProductId = i.ProductId

END

【问题讨论】:

  • 触发器不应引起递归。尽管触发器的名称是trig_UpdateProduct,但它是一个AFTER INSERT 触发器,所以它只在插入时触发(当然)。触发器 tsql 执行更新。还有一点值得注意的是Recursive Triggers Enabled 是一个可以在数据库级别设置的属性。在 SSMS 中,右键单击数据库并选择属性。单击“选择页面”窗格中的“选项”,您将看到一个将属性设置为 True/False 的位置。
  • @DMason,您能否发布此内容,以便我将您的回复标记为答案?谢谢。
  • @DMason,所以如果上面的触发器在 xyz 中插入了另一条记录,当 Recursive Trigger Enabled = false 时它不会触发递归?
  • 是的,没错。
  • @DMason,谢谢。我正在学习有关触发器的新知识。

标签: triggers sql-server-2008-r2


【解决方案1】:

触发器不应引起递归。尽管触发器的名称是trig_UpdateProduct,但它是一个AFTER INSERT 触发器,所以它只在插入时触发(当然)。触发器 tsql 执行更新。

还有一点值得注意的是Recursive Triggers Enabled 是一个可以在数据库级别设置的属性。在 SSMS 中,右键单击数据库并选择属性。单击“选择页面”窗格中的“选项”,您将看到一个将属性设置为 True/False 的位置。

【讨论】:

    猜你喜欢
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多