Триггеры DDL

Применяется к:SQL ServerAzure SQL DatabaseAzure, управляемому экземпляру SQL Azure

Триггеры DDL активируются в ответ на различные события языка DDL. Эти события в основном соответствуют инструкциям Transact-SQL, начинающимся с ключевых слов CREATE, ALTER, DROP, GRANT, DENY, REVOKE или UPDATE STATISTICS. Системные хранимые процедуры, выполняющие операции, подобные операциям DDL, также могут запускать триггеры DDL.

Используйте триггеры DDL, если хотите сделать следующее.

  • Предотвращать внесение определенных изменений в схему базы данных.

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

  • Записывать изменения или события схемы базы данных.

Внимание

Тестировать триггеры DDL, чтобы определить, как они отвечают на запущенные системные хранимые процедуры. Например: как инструкция CREATE TYPE, так и хранимая процедура sp_addtype вызывают срабатывание триггера DDL, созданного на событии CREATE_TYPE.

Типы триггеров DDL

Триггер DDL языка Transact-SQL

Специальный тип хранимой процедуры Transact-SQL, которая выполняет одну или несколько инструкций Transact-SQL в ответ на событие с областью действия сервера или базы данных. Например, триггер DDL может активироваться, если выполняется такая инструкция, как ALTER SERVER CONFIGURATION, или если происходит удаление таблицы с использованием команды DROP TABLE.

Триггер DDL среды CLR

Вместо выполнения хранимой процедуры Transact-SQL триггер CLR выполняет один или несколько методов, написанных в управляемом коде, которые являются членами сборки, созданной в .NET Framework и переданной в SQL Server.

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

Триггеры DDL не создают специальные таблицы inserted и deleted .

Сведения о событии, приведшем к срабатыванию триггера DDL, и последующих изменениях, выполненных триггером, можно получить при помощи функции EVENTDATA.

Для каждого события DDL должно быть создано несколько триггеров.

В отличие от триггеров DML, триггеры DDL не ограничены областью схемы. Поэтому для запроса метаданных о триггерах DDL нельзя воспользоваться такими функциями как OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY и OBJECTPROPERTYEX. Используйте вместо них представления каталога.

Триггеры DDL сервера появляются в обозревателе объектов среды SQL Server Management Studio в папке Triggers . Эта папка находится под папкой Объекты сервера . Триггеры DDL, доступные в области базы данных, находятся в папке Триггеры базы данных . Эта папка находится в папке Программирование соответствующей базы данных.

Внимание

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

Область действия триггера DDL

Триггеры DDL могут запускаться в ответ на событие 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 в любом контексте базы данных.

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

Выбор определенной инструкции 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 (9.x), если триггер создается в группе событий, sys.trigger_events не содержит сведения о группе событий, sys.trigger_events содержит сведения только о отдельных событиях, охваченных этой группой. В SQL Server 2008 (10.0.x) и более поздних версий sys.trigger_events сохраняет метаданные о группе событий, в которой создаются триггеры, а также о отдельных событиях, охватывающих группу событий. Поэтому изменения событий, охватываемых группами событий в SQL Server 2008 (10.0.x) и более поздних версий, не применяются к триггерам DDL, созданным на этих группах событий в SQL Server 2005 (9.x).

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

Задача Раздел
Описывает, как создать, изменить, удалить или отключить триггеры DDL. Реализация триггеров DDL
Описывает, как создать триггер DDL CLR. Создание триггеров CLR
Описывает, как возвратить сведения о триггерах DDL. Получение сведений о триггерах DDL
Описывает, как возвратить сведения о событии, которое активирует триггер DDL с использованием функции EVENTDATA. Использование функции EVENTDATA
Описывает, как управлять безопасностью триггеров. Управление безопасностью триггеров

См. также

Триггеры DML
Триггеры входа
CREATE TRIGGER (Transact-SQL)
EVENTDATA (Transact-SQL)