Sud*_*tty 7 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
Run Code Online (Sandbox Code Playgroud)
触发事件可以在另一个触发操作中触发。一个触发器执行甚至可以在另一张表或同一张表上触发。该触发器称为嵌套触发器或递归触发器。SQL Server 中的嵌套触发器最多支持 32 层触发器的嵌套。
嵌套意味着当一个触发器被触发时,它也会导致另一个触发器被触发。如果触发器创建不定式循环,则将超出 32 的嵌套级别,并且触发器将取消并显示错误消息。递归触发器是指触发器触发并执行一条语句,该语句将导致同一触发器触发。
禁用嵌套/递归触发器:以下脚本将停止执行所有嵌套触发器。
sp_CONFIGURE 'nested_triggers',0
GO
RECONFIGURE
GO
Run Code Online (Sandbox Code Playgroud)
还有一种停止触发递归的替代方法:
ALTER DATABASE databasename
SET RECURSIVE_TRIGGERS ON | OFF
Run Code Online (Sandbox Code Playgroud)
将触发器嵌套限制到一定级别 将以下脚本放入触发器代码中。这将在一定级别后停止触发递归。在以下情况下,它将在 5 次递归后停止。
IF ( TRIGGER_NESTLEVEL(OBJECT_ID(@@PROCID)) > 5 )
RETURN;
Run Code Online (Sandbox Code Playgroud)
MS SQL 设置了一些属性,除非您将其打开,否则不允许触发递归触发器。好吧,它将触发递归/嵌套触发器 32 次,然后失败。此外,这是一个更新触发器,而不是更新之前/之后触发器,因此它取代了更新功能本身。
这两种类型在数据库在更新中实际执行的操作之上创建功能。因此,如果之前或之后更改信息,数据库原始更新函数将再次触发,然后您就可以进入循环了。
这会覆盖数据库的正常功能,并且仅在发生更新时执行您告诉它执行的操作。在数据库中更新实际上是删除/插入的组合。当我第一次意识到这一点时,这也让我大吃一惊。