Как и триггеры DML (Data Manipulation Language), триггеры DDL (Data Definition Language) срабатывают в ответ на событие. Основное различие между триггерами DML и DDL заключается в событии, запускающем их. Триггеры DDL не срабатывают для инструкций INSERT, UPDATE и DELETE, Они предназначены для инструкций CREATE, ALTER, DROP и вообще для любых инструкций, модифицирующих структуру базы данных.
Этот новый тип триггера может оказаться полезным, когда требуется контролировать пользователей, модифицирующих структуру базы данных, их методы модификации, а также отслеживать изменения схемы. Предположим, что вы наняли временных служащих по контракту для работы с базой данных, и вам нужно, чтобы они не могли удалять столбцы, не ставя вас в известность. Для этого вы можете создать триггер DDL. Вы также можете позволить пользователю удалять любые столбцы и использовать триггер DDL для регистрации изменений в таблице.
Создадим триггер DDL, который предотвратит удаление или изменение таблиц в базе данных Sales. Чтобы посмотреть, как он работает, до создания триггера удалите связь между таблицами Orders и Products, которая обеспечивает ссылочную целостность данных и не позволит нам удалить или изменить таблицу Products даже без наличия триггера (при попытке удаления таблицы будет появляться сообщение об ограничении внешнего ключа). Для временного удаления (и последующего восстановления) связи воспользуйтесь диаграммой БД.
Для создания триггера выполните следующие действия.
1. Откройте новый запрос SQL Server и выполните следующий код.
USE Sales
GO
CREATE TRIGGER CantDropCustomers
ON DATABASE
FOR DROP_TABLE, ALTER_TABLE
AS
PRINT 'You must disable Trigger "CantDropCustomers" to drop or alter tables! '
ROLLBACK ;
3. Выполните команду Query=>New Query и протестируйте новый триггер путем выполнения кода
DROP TABLE Products
4. Вы должны увидеть сообщение об ошибке. В нем говорится, что вы не можете изменять таблицы, поскольку они защищены новым триггером (рис. 14).
Рис. 14. Создан триггер на запрет удаления и обновления таблицы