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


TRIGGER_NESTLEVEL (Transact-SQL)

Возвращает число обработчиков, выполненных при срабатывании триггера инструкции. Функция 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)

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