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


Триггеры DDL

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
Описывает управление безопасностью триггера. Управление безопасностью триггера

См. также

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