TRIGGER_NESTLEVEL (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例

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

Transact-SQL 语法约定

语法

TRIGGER_NESTLEVEL ( [ object_id ] , [ 'trigger_type' ] , [ 'trigger_event_category' ] )  

注意

若要查看 SQL Server 2014 (12.x) 及更早版本的 Transact-SQL 语法,请参阅早期版本文档

参数

object_id
触发器的对象 ID。 如果指定了 object_id,则返回为该语句执行指定触发器的次数。 如果未指定 object_id,则返回为该语句执行全部触发器的次数

'trigger_type'
指定将 TRIGGER_NESTLEVEL 应用于 AFTER 触发器还是 INSTEAD OF 触发器。 为 AFTER 触发器指定 AFTER。 为 INSTEAD OF 触发器指定 IOT。 如果指定了 trigger_type,则必须指定 trigger_event_category

'trigger_event_category'
指定将 TRIGGER_NESTLEVEL 应用于 DML 触发器还是 DDL 触发器。 为 DML 触发器指定 DML。 为 DDL 触发器指定 DDL。 如果指定了 trigger_event_category,则必须指定 trigger_type。 注意,由于 DDL 触发器只能是 AFTER 触发器,因此仅 AFTER 可以使用 DDL 指定

注解

如果未指定参数,则 TRIGGER_NESTLEVEL 返回调用堆栈上的触发器总数。 这包括它本身。 当触发器所执行的命令导致其他触发器激发,或导致触发器的连续激发时,可省略参数。

若要针对特殊触发器类型和事件类别返回调用堆栈上的触发器总数,请指定 object_id = 0

如果 TRIGGER_NESTLEVEL 在触发器的外部执行,且任何参数均不为 NULL,则 TRIGGER_NESTLEVEL 返回 0。

如果将任何参数显式指定为 NULL,则无论在触发器内部还是外部使用 TRIGGER_NESTLEVEL,都将返回值 NULL。

示例

A. 测试特定 DML 触发器的嵌套级别

IF ( (SELECT TRIGGER_NESTLEVEL( OBJECT_ID('xyz') , 'AFTER' , 'DML' ) ) > 5 )  
   RAISERROR('Trigger xyz nested more than 5 levels.',16,-1)  

B. 测试特定 DDL 触发器的嵌套级别

IF ( ( SELECT TRIGGER_NESTLEVEL ( ( SELECT object_id FROM sys.triggers  
WHERE name = 'abc' ), 'AFTER' , 'DDL' ) ) > 5 )  
   RAISERROR ('Trigger abc nested more than 5 levels.',16,-1)  

C. 测试执行的所有触发器的嵌套级别

IF ( (SELECT trigger_nestlevel() ) > 5 )  
   RAISERROR  
      ('This statement nested over 5 levels of triggers.',16,-1)  

另请参阅

CREATE TRIGGER (Transact-SQL)