go
Create trigger trig2
On table1
Instead of delete
Not for replication
as
Begin
Declare
@var int
set @var = (select [object_id] from sys.objects where
name = 'trig2'and TYPE = 'TR'
and schema_id = (select schema_id from sys.schemas
where name = 'dbo'
)
)
if (TRIGGER_NESTLEVEL(@var, 'IOT', 'DML') = 1)
Begin
delete from table1 from deleted d where table1.c3 = d.c3
End
End
go
Т.к. триггер INSTEAD OF срабатывает вместо команды DELETE, то данные из таблицы table1 удаляться не будут. Для того чтобы их удалить (удаляемые данные хранятся в специальной таблице deleted), необходимо повторить это действие в теле триггера. Как и в прошлом примере, максимальное количество рекурсивных вызовов этого триггера = 2.
В результате выполнения команды:
delete table1 where c1 = 2
что приведет к срабатыванию триггера trig2, таблица table1 будет содержать следующие данные:
Пример 3.
Создание простейшего INSTEAD OF триггера, который срабатывает при выполнении всех трех команд (INSERT, UPDATE, DELETE) и, определяя тип команды, повторяет действия, которые команда должна была выполнить над данными таблицы.
if exists(select * from sys.objects where name = 'trig3' and schema_id = (select schema_id from sys.schemas where name = 'dbo') and type = 'TR')
Drop trigger trig3
go
Create trigger trig3
On table1
Instead of insert, update, delete