TRIGGER_NESTLEVEL (Transact-SQL)
適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體
傳回針對引發了觸發程序之陳述式而執行的觸發程序數目。 DML 和 DDL 觸發程序利用 TRIGGER_NESTLEVEL 來判斷目前的巢狀層級。
語法
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)