Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Область применения: 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_NAME
OBJECTPROPERTY
и 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 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
содержит сведения только о отдельных событиях, охватываемых этой группой.
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 |
Описывает, как управлять безопасностью триггеров. | Управление безопасностью триггера |