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