set @var = (select [object_id] from sys.objects where name = 'trig1' and TYPE = 'TR'
and schema_id = (select schema_id from sys.schemas where name = ‘dbo’)
)
if (TRIGGER_NESTLEVEL(@var, 'AFTER', 'DML') = 1)
Begin
if exists(select c1 from deleted where c1 = 1)
Begin
delete from table1 where c1 = 1
End
End
End
go
В этом случае при создании триггера в его теле определяется идентификатор триггера, получаемый на основании его имени из системного представления sys.objects. После этого используется функция TRIGGER_NESTLEVEL, которая в качестве 1-ого аргумента получает идентификатор интересующего нас триггера, в качестве 2-ого аргумента получает тип срабатывания триггера (‘AFTER’ или ‘IOT’ для INSTEAD OF триггеров), а в качестве 3-его аргумента – тип триггера (‘DML’ или ‘DDL’). В результате своей работы эта функция возвращает количество рекурсивных вызовов (вызовов, помещенных в стеке) для выбранного триггера (триггеров). Если количество срабатываний = 1, то выполняются запланированные в триггере действия. Таким образом максимальное количество рекурсивных срабатываний триггера не превышает 2 раз.
При использовании функция TRIGGER_NESTLEVEL, следует учитывать, что
1. Все ее аргументы являются необязательными. Если все аргументы отсутствуют, то вычисляется количество рекурсивных вызовов для всех видов триггеров. Если какой-либо из аргументов отсутствует, то подразумеваются все триггеры указанного вида (вида срабатывания) или типа.
2. Если указан 2-ой аргумент, то следует указывать и 3-ий аргумент.
Пример 2.
Создание простейшего INSTEAD OF триггера, который срабатывает при выполнении команды DELETE и повторяет действия, которые эта команда выполняла над данными таблицы.
if exists (select * from sys.objects where name = 'trig2' and
schema_id = (select schema_id from sys.schemas where name = 'dbo')