TRIGGER_NESTLEVEL (Transact-SQL)

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

主题链接图标Transact-SQL 语法约定

语法

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

参数

  • 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 触发器,因此只能使用 DDL 指定 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)