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

时间:2014-04-22 16:13:24

标签: sql sql-server triggers ssms-2012

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

1 个答案:

答案 0 :(得分:3)

我认为您应该能够使用the TRIGGER_NESTLEVEL() function来实现自己的目的,该功能自SQL Server 2008开始可用:

  

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

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

IF TRIGGER_NESTLEVEL(
    ( SELECT object_id FROM sys.triggers WHERE name = 'MyTrigger' )
) > 1 RETURN

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

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