Поделиться через


Триггеры DDL

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр 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

триггер Transact-SQL

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

Триггер CLR

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

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

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

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

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

В отличие от триггеров языка обработки данных (DML), триггеры DDL не ограничены схемами. Таким образом, такие функции, как OBJECT_ID, OBJECT_NAMEOBJECTPROPERTYи OBJECTPROPERTYEX не могут использоваться для запроса метаданных о триггерах DDL. Используйте вместо них представления каталога.

Триггеры 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;

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

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

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