TRIGGER_NESTLEVEL (Transact-SQL)

傳回針對引發了觸發程序之陳述式而執行的觸發程序數目。DML 和 DDL 觸發程序利用 TRIGGER_NESTLEVEL 來判斷目前的巢狀層級。

主題連結圖示Transact-SQL 語法慣例

語法

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

引數

  • object_id
    這是觸發程序的物件識別碼。如果指定 object_id,就會傳回針對陳述式而執行之指定觸發程序的次數。如果未指定 object_id,就會傳回針對陳述式而執行之所有觸發程序的次數。

  • 'trigger_type'
    指定是否將 TRIGGER_NESTLEVEL 套用在 AFTER 觸發程序或 INSTEAD OF 觸發程序。指定 AFTER 表示 AFTER 觸發程序。指定 IOT 表示 INSTEAD OF 觸發程序。如果指定了 trigger_type,您也必須指定 trigger_event_category。

  • 'trigger_event_category'
    指定是否將 TRIGGER_NESTLEVEL 套用在 DML 或 DDL 觸發程序。指定 DML 表示 DML 觸發程序。指定 DDL 表示 DDL 觸發程序。如果指定了 trigger_event_category,您也必須指定 trigger_type。請注意,只有 AFTER 可以指定 DDL,因為 DDL 觸發程序只能是 AFTER 觸發程序。

備註

當未指定任何參數時,TRIGGER_NESTLEVEL 會在呼叫堆疊上傳回觸發程序的總數。其中包括它本身。當觸發程序執行命令,造成引發另一個觸發程序或建立引發後續觸發程序時,可能會省略參數。

若要在特定觸發程序類型和事件類別目錄的呼叫堆疊上,傳回觸發程序的總數,請指定 object_id = 0。

如果 TRIGGER_NESTLEVEL 在觸發程序之外執行,且有任何參數不是 NULL,它便會傳回 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)