Аналогичным образом необходимо поступать и при проверке существования и удалении LOGON триггеров.
*/
if exists(select name from sys.triggers where name = 'trig_ddl1' and parent_class = 0)
Drop trigger trig_ddl1 on database
go
-- Создаем DDL триггер
Create trigger trig_ddl1
On database
For DROP_TABLE
as
Begin
/*
С помощью метода value() получаем содержимое полей ObjectName и SchemaName (большие и маленькие буквы различаются) xml данных, возвращаемых функцией eventdata(), которое при этом неявно приводится к типу данных varchar(128). Эти поля хранят имя удаляемого объекта и его пространство имен. Если эти элементы совпадают со значениями table1 и dbo, соответственно, то производим откат транзакции для отмены команды удаления таблицы.
*/
if (eventdata().value('(EVENT_INSTANCE/ObjectName)[1]', 'varchar(128)') = 'table1')
And
(eventdata().value('(EVENT_INSTANCE/SchemaName)[1]', 'varchar(128)') = 'dbo')
ROLLBACK transaction
End
go
Следует отметить, что для события DROP_TABLE, как и для большинства подобных событий, функцией eventdata() возвращаются xml данные, содержащие следующие элементы(параметры):
| Название элемента
| Тип данных элемента
|
| SchemaName
| String
|
| TSQLCommand
| String
|
| PostTime
| DateTime
|
| SQLInstance
| String
|
| ObjectName
| String
|
| ObjectType
| String
|
| DatabaseName
| String
|
| ComputerName
| String
|
| SPID
| Sint32
|
| LoginName
| String
|
| UserName
| String
|
Если после создания триггера trig_ddl1 выполнить следующие SQL команды: