Проектирование триггеров DDL
Изменения: 12 декабря 2006 г.
Перед тем как приступить к проектированию триггера DDL, необходимо выполнить следующие требования.
- Необходимо понимать область триггера DDL.
- Необходимо определить, какая инструкция или группа инструкций Transact-SQL будут заставлять триггер срабатывать.
Примечание безопасности. |
---|
Вредоносный программный код внутри триггеров может быть запущен с расширенными правами доступа. Дополнительные сведения о снижении вероятности возникновения этой угрозы см. в разделе Управление безопасностью триггеров. |
Основные сведения об области триггеров
Триггеры DLL срабатывают в ответ на событие Transact-SQL, обработанное текущей базой данных или текущим сервером. Область триггера зависит от события. Например, триггер DDL, срабатывающий в ответ на событие CREATE TABLE, будет срабатывать каждый раз, когда в базе данных будет выполняться инструкция CREATE TABLE. Триггер DDL, срабатывающий в ответ на событие CREATE LOGIN, будет срабатывать каждый раз, когда на сервере будет выполняться инструкция CREATE LOGIN.
В следующем примере триггер DDL safety
будет срабатывать каждый раз, когда в базе данных будут выполняться инструкции DROP TABLE
или ALTER TABLE
.
CREATE TRIGGER safety
ON DATABASE
FOR DROP_TABLE, ALTER_TABLE
AS
PRINT 'You must disable Trigger "safety" to drop or alter tables!'
ROLLBACK
;
В следующем примере триггер DDL выводит сообщение, если в текущем экземпляре сервера происходит любое событие CREATE DATABASE
. Он использует функцию EVENTDATA
для получения текста соответствующей инструкции Transact-SQL. Дополнительные сведения об использовании EVENTDATA с триггерами DDL Triggers см. в разделе Использование функции EVENTDATA.
IF EXISTS (SELECT * FROM sys.server_triggers
WHERE name = 'ddl_trig_database')
DROP TRIGGER ddl_trig_database
ON ALL SERVER;
GO
CREATE TRIGGER ddl_trig_database
ON ALL SERVER
FOR CREATE_DATABASE
AS
PRINT 'Database Created.'
SELECT EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')
GO
DROP TRIGGER ddl_trig_database
ON ALL SERVER;
GO
Списки сопоставления инструкций Transact-SQL соответствующим областям можно найти по ссылкам в подразделе «Выбор определенной инструкции DDL для запуска триггера DDL» далее в этом разделе.
Триггеры DDL масштаба базы данных хранятся как объекты в базах данных, в которых они создаются. Триггеры DDL можно также создавать в базе данных master; они будут работать точно так же, как триггеры, созданные в пользовательских базах данных. Сведения относительно триггеров DDL можно получить в представлении каталога sys.triggers в контексте базы данных, где они были созданы, либо указав в качестве идентификатора имя базы данных, например master.sys.triggers.
Триггеры DDL масштаба триггера хранятся как объекты в базе данных master. Однако сведения о триггерах DDL масштаба сервера можно получить из представления каталога sys.server_triggers в любом контексте базы данных.
Дополнительные сведения о получении метаданных для триггеров DDL см. в инструкции Получение сведений о триггерах DDL.
Триггеры DDL не срабатывают в ответ на события, влияющие на локальные или глобальные временные таблицы и хранимые процедуры.
Задание инструкций или групп инструкций Transact-SQL
Триггеры DDL могут срабатывать в ответ на следующие события:
- одну или несколько определенных инструкций DDL;
- предопределенную группу инструкций DDL.
Выбор определенной инструкции DDL для запуска триггера DDL
Триггеры DDL могут срабатывать после выполнения одной или нескольких определенных инструкций Transact-SQL. В предыдущем примере триггер безопасно срабатывает после любого события DROP TABLE или ALTER TABLE.
Не все DDL-события можно использовать для запуска триггеров DDL. Некоторые события предназначены только для асинхронных инструкций, не входящих в транзакции. Например, для запуска триггера DDL невозможно использовать событие ADD_ROLE_MEMBER. Для таких событий следует применять уведомления о событиях. Дополнительные сведения об уведомлениях о событиях см. в инструкции Уведомления о событиях (компонент Database Engine).
В теме DDL-события, вызывающие срабатывание триггеров DDL перечислены инструкции Transact-SQL, которые можно выбирать для запуска триггеров DDL, а также область срабатывания каждого из них.
Выбор предопределенной группы инструкций DDL для запуска триггера DDL
Триггер DDL может срабатывать после любого события Transact-SQL, принадлежащего предопределенной группе схожих событий. Например, если нужно, чтобы триггер DDL срабатывал после выполнения любой инструкции CREATE TABLE, ALTER TABLE или DROP TABLE, можно указать FOR DDL_TABLE_EVENTS в инструкции CREATE TRIGGER. После выполнения CREATE TRIGGER события, входящие в группу событий, добавляются в представление каталога sys.trigger_events.
В теме Группы событий для использования с триггерами DDL перечислены предопределенные группы инструкций DDL, доступные для использования с триггерами DDL, определенные входящие в них инструкции, а также области программирования этих групп событий.
См. также
Основные понятия
Использование функции EVENTDATA
Основные сведения о триггерах DDL
Реализация триггеров DDL
Справка и поддержка
Получение помощи по SQL Server 2005
Журнал изменений
Версия | Журнал |
---|---|
12 декабря 2006 г. |
|
17 июля 2006 г. |
|