Проектирование триггеров DDL

Перед тем как приступить к проектированию триггера DDL, выполните следующие требования.

  • Необходимо понять область действия триггера DDL.

  • Необходимо определить, какая инструкция или группа инструкций Transact-SQL будут запускать триггер.

Примечание по безопасностиПримечание по безопасности

Вредоносный программный код внутри триггеров может быть запущен с расширенными правами доступа. Дополнительные сведения о том, как уменьшить эту угрозу, см. в разделе Управление безопасностью триггеров.

ПримечаниеПримечание

Триггеры DDL не срабатывают в ответ на события, влияющие на локальные или глобальные временные таблицы и хранимые процедуры.

Основные сведения об области триггеров

Триггеры 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 см. в разделе Использование функции 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. Запрос к sys.triggers можно выполнить в контексте базы данных, где были созданы триггеры. Или можно задать имя базы данных в качестве идентификатора, например master.sys.triggers.

Триггеры DDL масштаба триггера хранятся как объекты в базе данных master. Однако для получения сведений о серверных триггерах DDL можно направить запрос к представлению каталога sys.server_triggers в любом контексте базы данных.

Дополнительные сведения о получении метаданных для триггеров DDL см. в инструкции Получение сведений о триггерах DDL.

Задание инструкций или групп инструкций Transact-SQL

Триггеры DDL могут быть созданы для срабатывания на одну или несколько определенных инструкций DDL или на стандартную группу инструкций DDL.

Выбор определенной инструкции DDL для запуска триггера DDL

Триггеры DDL могут срабатывать после выполнения одной или нескольких определенных инструкций Transact-SQL. В предыдущем примере триггер safety срабатывает после любого события DROP_TABLE или ALTER_TABLE. Списки инструкций Transact-SQL, которые можно задать для запуска триггера DDL, а также область действия триггера см. в разделе DDL-события.

Выбор предопределенной группы инструкций DDL для запуска триггера DDL

Триггер DDL может срабатывать после любого события Transact-SQL из заданной группы схожих событий. Например, если нужно, чтобы триггер DDL срабатывал после выполнения любой инструкции CREATE TABLE, ALTER TABLE или DROP TABLE, можно указать FOR DDL_TABLE_EVENTS в инструкции CREATE TRIGGER. После выполнения CREATE TRIGGER события, входящие в группу событий, добавляются в представление каталога sys.trigger_events.

ПримечаниеПримечание

В SQL Server 2005, если триггер создается для группы событий, представление sys.trigger_events не содержит сведения о группе событий. Представление sys.trigger_events содержит сведения только об отдельных событиях, входящих в группу. В SQL Server 2008 представление sys.trigger_events хранит метаданные о группе событий, для которой создан триггер, а также о событиях, входящих в эту группу. Следовательно, изменения для событий группы в SQL Server 2008 не относятся к триггерам DDL, которые создаются для этих групп событий в SQL Server 2005.

Список стандартных групп инструкций DDL для триггеров DDL, инструкции, входящие в эти группы событий, а также области, где можно программировать эти группы событий, приводятся в разделе Группы DDL-событий.