TRIGGER_NESTLEVEL (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

トリガーを起動したステートメントに対して実行されたトリガーの数を返します。 TRIGGER_NESTLEVEL は、DML トリガーおよび DDL トリガーで、現在の入れ子レベルを調べるときに使用します。

Transact-SQL 構文表記規則

構文

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

Note

SQL Server 2014 (12.x) 以前のバージョンの Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。

引数

object_id
トリガーのオブジェクト ID です。 object_id を指定すると、指定したトリガーがステートメントに対して実行された回数が返されます。 object_id を指定しない場合は、そのステートメントに対して実行されたすべてのトリガーの実行回数が返されます。

'trigger_type'
AFTER トリガーと INSTEAD OF トリガーのどちらに TRIGGER_NESTLEVEL を適用するかを指定します。 AFTER トリガーの場合は AFTER を指定します。 INSTEAD OF トリガーの場合は IOT を指定します。 trigger_type を指定するときは trigger_event_category も指定する必要があります。

'trigger_event_category'
DML トリガーと DDL トリガーのどちらに TRIGGER_NESTLEVEL を適用するかを指定します。 DML トリガーの場合は DML を指定します。 DDL トリガーの場合は DDL を指定します。 trigger_event_category を指定するときは trigger_type も指定する必要があります。 DDL の場合は AFTER だけを指定できます。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)