sql-server - 将触发表上的更新将是递归的

标签 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

最佳答案

触发事件可以在另一个触发操作中触发。一个触发器执行甚至可以在另一张表或同一张表上触发。该触发器称为嵌套触发器或递归触发器。 SQL Server 中的嵌套触发器最多支持 32 层触发器的嵌套。

嵌套意味着当一个触发器被触发时,它也会导致另一个触发器被触发。 如果触发器创建不定式循环,则将超出 32 层嵌套,触发器将取消并显示错误消息。递归触发器是指触发器触发并执行一条语句,该语句将导致同一触发器触发。

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

sp_CONFIGURE 'nested_triggers',0
GO
RECONFIGURE
GO

还有一种停止触发递归的替代方法:

ALTER DATABASE databasename
SET RECURSIVE_TRIGGERS ON | OFF

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

IF ( TRIGGER_NESTLEVEL(OBJECT_ID(@@PROCID)) > 5 )
    RETURN;

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

关于sql-server - 将触发表上的更新将是递归的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26858636/

相关文章:

sql-server - SQL Server Profiler 是否可以记住列宽?

c# - 获取表中插入行的实时提要

sql - 防止 SQL 数据库中的数据欺诈和删除

python - Python 中的递归?运行时错误 : maximum recursion depth exceeded while calling a Python object

mysql - 插入前 SQL 触发器出现问题

PostgreSQL : Trigger in background

sql - 计算日期/时间范围内超出数据集的总时间

python 挖掘和递归

recursion - Spring Integration ftp入站 channel 适配器递归同步

mysql - 在MySQL中创建触发器并更新