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


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

Изменения: 12 декабря 2006 г.

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

  • Необходимо понимать область триггера DDL.
  • Необходимо определить, какая инструкция или группа инструкций Transact-SQL будут заставлять триггер срабатывать.
ms186406.security(ru-ru,SQL.90).gifПримечание безопасности.
Вредоносный программный код внутри триггеров может быть запущен с расширенными правами доступа. Дополнительные сведения о снижении вероятности возникновения этой угрозы см. в разделе Управление безопасностью триггеров.

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

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

Измененное содержимое
  • Исправлены неверные сведения о невозможности использования события CREATE_DATABASE для запуска триггера DDL. Это событие может быть заменено на ADD_ROLE_MEMBER в качестве примера события, которое можно использовать для срабатывания уведомления о событии, но не триггера DDL.

17 июля 2006 г.

Измененное содержимое
  • Обновлен второй пример в разделе «Основные сведения об области триггеров».