Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SQLServer中禁用表或触发器级别的触发器嵌套?_Sql_Sql Server_Tsql_Database Trigger_Ssms 2012 - Fatal编程技术网

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

如何在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

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

我认为您应该能够通过使用来实现您的目的,该功能自SQL Server 2008起就已提供:

返回为触发触发器的语句执行的触发器数<代码>触发器\嵌套级别在DML和DDL触发器中用于确定当前嵌套级别

您可以更改相关触发器的代码,以便在
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')