Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
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.
Триггер CLR DDL
Вместо выполнения хранимой процедуры Transact-SQL триггер CLR выполняет один или несколько методов, написанных в управляемом коде, которые являются членами сборки, созданной в .NET Framework и отправленной в SQL Server.
DDL запускается только после запуска инструкций DDL, которые запускают их. Триггеры DDL нельзя использовать в качестве триггеров INSTEAD OF. Триггеры DDL не запускаются в ответ на события, влияющие на локальные или глобальные временные таблицы и хранимые процедуры.
Триггеры DDL не создают специальные inserteddeleted и таблицы.
Сведения о событии, которое запускает триггер DDL, и последующие изменения, вызванные триггером, фиксируются с помощью функции EVENTDATA.
Для каждого события DDL необходимо создать несколько триггеров.
В отличие от триггеров DML, триггеры DDL не относятся к схемам. Таким образом, такие функции, как OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY и OBJECTPROPERTYEX, нельзя использовать для запроса метаданных о триггерах DDL. Вместо этого используйте представления каталога.
Триггеры DDL с областью действия сервера отображаются в обозревателе объектов SQL Server Management Studio в папке "Триггеры ". Эта папка находится в папке "Объекты сервера ". Триггеры DDL с областью действия базы данных отображаются в папке "Триггеры базы данных ". Эта папка находится в папке Programmability соответствующей базы данных.
Это важно
Вредоносный код внутри триггеров может выполняться под повышенными привилегиями. Дополнительные сведения о том, как уменьшить эту угрозу, см. в разделе "Управление безопасностью триггеров".
Область триггера 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. В предыдущем примере после любого DROP_TABLE или ALTER_TABLE события срабатывает триггер safety. Список инструкций 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".
Связанные задачи
| Задача | Тема |
|---|---|
| Описывает создание, изменение, удаление или отключение триггеров DDL. | Реализация триггеров DDL |
| Описывает, как создать триггер DDL CLR. | Создать триггеры CLR |
| Описывает, как возвращать сведения о триггерах DDL. | Получение сведений об триггерах DDL |
| Описывает, как возвращать сведения о событии, которое запускает триггер DDL с помощью функции EVENTDATA. | Использование функции EVENTDATA |
| Описывает управление безопасностью триггера. | Управление безопасностью триггера |