TRIGGER_NESTLEVEL (Transact-SQL)
トリガを起動したステートメントに対して実行されたトリガの数を返します。TRIGGER_NESTLEVEL は、DML トリガおよび DDL トリガで、現在の入れ子レベルを調べるときに使用します。
構文
TRIGGER_NESTLEVEL ( [ object_id ] , [ 'trigger_type' ] , [ 'trigger_event_category' ] )
引数
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)