1

下面是我的触发器,它不是递归调用的,你能解释一下吗

USE [TESTING]
GO
/****** Object:  Trigger [dbo].[UPDATETRIGGER] ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[UPDATETRIGGER] on [dbo].[TEST]
 FOR UPDATE 
 AS
  UPDATE dbo.TEST
    SET lastEditedDate=GetDate()
    FROM INSERTED newdata
    WHERE TEST.MasterK = newdata.MasterK
4

2 回答 2

2

嵌套触发器和触发器递归:

默认情况下,Adaptive Server 允许嵌套触发器。要防止触发器嵌套,请使用 sp_configure 将允许嵌套触发器选项设置为 0(关闭):

sp_configure "allow nested triggers", 0

触发器可以嵌套到 16 级深度。如果触发器更改了另一个触发器所在的表,则第二个触发器将触发,然后可以调用第三个触发器,依此类推。如果链中的任何触发器引发无限循环,则超过嵌套级别并且触发器中止,回滚包含触发器查询的事务。

注意:由于触发器被放入事务中,因此嵌套触发器集的任何级别的失败都会取消整个事务:所有数据修改都会回滚。为您的触发器提供消息和其他错误处理和调试帮助,以确定故障发生的位置。

全局变量@@nestlevel 包含当前执行的嵌套级别。每次存储过程或触发器调用另一个存储过程或触发器时,嵌套级别都会递增。创建缓存语句时,嵌套级别也会加一。如果超过最大值 16,则事务中止。

如果触发器调用的存储过程执行的操作会导致触发器再次触发,则仅在启用嵌套触发器时才会重新激活触发器。除非触发器中有限制递归次数的条件,否则这会导致嵌套级溢出。

例如,如果更新触发器调用执行更新的存储过程,则如果禁用允许嵌套触发器,则触发器和存储过程将执行一次。如果启用了允许嵌套触发器,并且更新次数不受触发器或过程中的条件限制,则过程或触发器循环将继续,直到超过 16 级最大嵌套值。

默认情况下,触发器不会调用自身来响应触发器内对同一表的第二次数据修改,无论允许嵌套触发器配置参数的设置如何。设置选项 self_recursion 使触发器能够作为触发器内的数据修改的结果再次触发。例如,如果表的一列上的更新触发器导致对另一列的更新,则更新触发器仅在 self_recursion 禁用时触发一次,但如果 self_recursion 设置为 on,它最多可以触发 16 次。为了进行自递归,还必须启用允许嵌套触发器配置参数。

于 2014-11-11T13:03:48.543 回答
0

需要注意的一点是,在 SQL Server 中,每个语句触发一次,而不是每行触发一次。因此,如果您的更新语句更新多行,则InsertedDeleted表将包含多行。您可能想要更改您的UPDATE声明,如下所示

  UPDATE t
    SET lastEditedDate = GetDate()
    FROM dbo.TEST t
    JOIN INSERTED i ON t.MasterK = i.MasterK
于 2014-11-11T13:08:44.023 回答