将触发表上的UPDATE将是递归的

时间:2014-11-11 06:06:39

标签: sql-server recursion triggers mssql-jdbc

我在表格 TEST 上触发 UPDATETRIGGER

当TEST表更新时,它被编写为被调用。

现在, UPDATETRIGGER 正在更新同一 TEST 表的列。

这会递归吗?

我的触发器和表位于MS SQL数据库中。从表格值我看到它没有发生这种方式可以任何人解释。

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

2 个答案:

答案 0 :(得分:3)

触发事件可以在另一个触发操作中触发。一个触发器执行甚至可以在另一个表或同一个表上触发。此触发器称为NESTED TRIGGER或RECURSIVE TRIGGER。 SQL Server中的嵌套触发器支持最多32个级别的触发器嵌套。

嵌套意味着触发触发器时,它还会触发另一个触发器。 如果触发器创建了一个不定式循环,则将超过32的嵌套级别,并且触发器将取消并显示错误消息。递归触发器是指触发器触发并执行将导致触发相同触发器的语句。

禁用嵌套/递归触发器:以下脚本将停止执行所有嵌套触发器。

sp_CONFIGURE 'nested_triggers',0
GO
RECONFIGURE
GO

还有另一种方法可以停止触发器递归:

ALTER DATABASE databasename
SET RECURSIVE_TRIGGERS ON | OFF

将触发器嵌套限制到特定级别 将以下脚本放在触发器代码中。这将在某些级别后停止触发器递归。在下面的情况下,它会在5次递归后停止。

IF ((
SELECT TRIGGER_NESTLEVEL()) > 5 )
RETURN

参考: - http://blog.sqlauthority.com/2007/05/18/sql-server-2005-understanding-trigger-recursion-and-nesting-with-examples/

答案 1 :(得分:0)

MS SQL有一些属性设置,除非你打开它们,否则不允许触发递归触发器。好吧,它将触发递归/嵌套触发器32次,然后失败。此外,这是一个更新触发器而不是更新前/后触发器,因此这取代了更新功能本身。

After(For)/ Before

之后

这两种类型在数据库在更新中实际执行的操作之上创建功能。因此,如果更改之前或之后的信息,数据库原始更新功能将再次触发,然后您就可以进入循环。

而不是

这会覆盖数据库的正常功能,并且只会在发生更新时执行您要求它执行的操作。在数据库中,更新实际上是删除/插入的组合。当我第一次意识到这一点时,这让我大吃一惊。