如何在SQLServer的表或触发器级别禁用触发器嵌套?

Jim*_*Jim 6 sql t-sql sql-server triggers ssms-2012

使用SQL Server 2012,是否有可能在服务器/数据库级别启用嵌套触发器,但在一个特定的表/触发器上禁用嵌套?

GMB*_*GMB 7

我认为您应该能够通过使用自 SQL Server 2008 以来可用TRIGGER_NESTLEVEL()函数来实现您的目的:

返回为触发触发器的语句执行的触发器数。TRIGGER_NESTLEVEL用于 DML 和 DDL 触发器以确定当前的嵌套级别。

您可以更改相关触发器的代码以在BEGIN关键字后添加以下语句。诀窍是动态计算object_id当前触发器的 ,它TRIGGER_NESTLEVEL()期望作为第一个参数:

IF TRIGGER_NESTLEVEL(
    ( SELECT object_id FROM sys.triggers WHERE name = 'MyTrigger' )
) > 1 RETURN
Run Code Online (Sandbox Code Playgroud)

这实际上会阻止给定的触发器递归执行。

另一种选择是TRIGGER_NESTLEVEL()不带参数使用。这将返回为语句执行所有触发器的次数。我对您的用例的理解是,第一个解决方案应该是您需要的。