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)

请参阅

参考

CREATE TRIGGER (Transact-SQL)