go
select * from table1
то в итоге их работы будет получено сообщение, подобное следующему:
Msg 3609, Level 16, State 2, Line 2
The transaction ended in the trigger. The batch has been aborted.
а также такой результат выборки данных:
Очевидно, что попытка удаления таблицы с именем table1 к успеху не привела.
Пример 5.
Создание DDL триггера, реагирующего на группу событий DDL_TABLE_EVENTS, которая включает события CREATE_TABLE, ALTER_TABLE и DROP_TABLE. При этом триггер не позволяет создавать таблицы в текущей БД, а также не позволяет удалять и изменять структуру таблицы table1.
if exists(select name from sys.triggers where name = 'trig_ddl2' and parent_class = 0)
Drop trigger trig_ddl2 on database
go
Create trigger trig_ddl2
On database
For DDL_TABLE_EVENTS
as
Begin
declare @command varchar(8000),
@word varchar(20)
/*
Получаем текст TSQL команды, которая активировала триггер, убирая у нее начальные незначащие пробелы
*/
set @command = LTRIM
(
eventdata().value('(EVENT_INSTANCE/TSQLCommand)[1]',
'varchar(8000)')
)
/*
Выделяем из полученной команды подстроку, начиная от 1-ого символа, длина которой равна позиции 1-ого пробела – 1
*/
set @word = substring(@command, 1, CHARINDEX(' ', @command, 1) - 1)
if (UPPER(@word) = 'CREATE')
or
(eventdata().value('(EVENT_INSTANCE/ObjectName)[1]', 'varchar(128)') = 'table1')
And
(eventdata().value('(EVENT_INSTANCE/SchemaName)[1]', 'varchar(128)') = 'dbo')