如何在SQLServer中禁用表或触发器级别的触发器嵌套?
使用SQL Server 2012,是否可以在服务器/数据库级别启用嵌套触发器,但可以在一个特定的表/触发器上禁用嵌套?我认为您应该能够通过使用来实现您的目的,该功能自SQL Server 2008起就已提供: 返回为触发触发器的语句执行的触发器数<代码>触发器\嵌套级别在DML和DDL触发器中用于确定当前嵌套级别 您可以更改相关触发器的代码,以便在如何在SQLServer中禁用表或触发器级别的触发器嵌套?,sql,sql-server,tsql,database-trigger,ssms-2012,Sql,Sql Server,Tsql,Database Trigger,Ssms 2012,使用SQL Server 2012,是否可以在服务器/数据库级别启用嵌套触发器,但可以在一个特定的表/触发器上禁用嵌套?我认为您应该能够通过使用来实现您的目的,该功能自SQL Server 2008起就已提供: 返回为触发触发器的语句执行的触发器数触发器\嵌套级别在DML和DDL触发器中用于确定当前嵌套级别 您可以更改相关触发器的代码,以便在BEGIN关键字之后添加以下语句。诀窍是动态计算当前触发器的对象id,该trigger\u NESTLEVEL()期望作为第一个参数: IF TRIGGER
BEGIN
关键字之后添加以下语句。诀窍是动态计算当前触发器的对象id
,该trigger\u NESTLEVEL()
期望作为第一个参数:
IF TRIGGER_NESTLEVEL(
( SELECT object_id FROM sys.triggers WHERE name = 'MyTrigger' )
) > 1 RETURN
这实际上会阻止给定触发器递归执行
另一个选项是使用
TRIGGER\u NESTLEVEL()
而不带参数。这将返回为语句执行所有触发器的次数。我对您的用例的理解是,第一个解决方案应该是您所需要的。IMO,嵌套触发器通常是错误的设计。调试困难(几乎不可能),维护困难。你有XY问题吗?的确,这是一个很好的解决方案,如果需要,甚至可以控制嵌套触发的深度。@SebastianZartner:的确。。。有关完整的测试场景,请参阅。ID更简洁的表达式是OBJECT\u ID('my\u trigger','TR')