TRIGGER_NESTLEVEL (Transact-SQL)

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體

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

Transact-SQL 語法慣例

Syntax

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

注意

若要檢視 SQL Server 2014 (12.x) 和舊版的 Transact-SQL 語法,請參閱 舊版檔

引數

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)  

另請參閱

CREATE TRIGGER (Transact-SQL)