Поделиться через


TRIGGER_NESTLEVEL (Transact-SQL)

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

Возвращает число обработчиков, выполненных при срабатывании триггера инструкции. Функция TRIGGER_NESTLEVEL используется в триггерах DML и DDL для определения текущего уровня вложенности.

Соглашения о синтаксисе 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. Для триггеров INSTEAD OF укажите IOT. Если указан аргумент trigger_type, необходимо также указать trigger_event_category.

' trigger_event_category '
Указывает, к каким триггерам применять функцию TRIGGER_NESTLEVEL — DML или DDL. Для триггеров DML следует указать DML, для триггеров DDL — DDL. Если указан аргумент trigger_event_category, необходимо также указать trigger_type. При использовании значения DDL значение предыдущего аргумента может быть только AFTER, так как триггеры DDL всегда являются триггерами AFTER.

Замечания

Если не задано никаких аргументов, функция TRIGGER_NESTLEVEL возвращает общее число триггеров в стеке вызова. Этот список также включает и саму функцию TRIGGER_NESTLEVEL. Пропуск аргументов может наблюдаться в случае, когда триггер выполняет команды, приводящие к запуску другого триггера, или создает последовательность запускаемых триггеров.

Для возвращения общего числа триггеров в стеке вызовов для конкретного типа триггеров и категории событий следует указать аргумент object_id = 0.

Функция TRIGGER_NESTLEVEL возвращает 0 в случае выполнения вне триггера, если значение хотя бы одного из аргументов не равно NULL.

Если каким-либо аргументам явно задано значение NULL, то оно возвращается независимо от того, внутри или вне триггера использовалась функция TRIGGER_NESTLEVEL.

Примеры

А. Проверка уровня вложенности конкретного триггера 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)  

В. Проверка уровня вложенности всех сработавших триггеров

IF ( (SELECT trigger_nestlevel() ) > 5 )  
   RAISERROR  
      ('This statement nested over 5 levels of triggers.',16,-1)  

См. также

CREATE TRIGGER (Transact-SQL)