Триггеры DDLDDL Triggers

ОБЛАСТЬ ПРИМЕНЕНИЯ: даSQL Server даБаза данных SQL Azure нетAzure Synapse Analytics (хранилище данных SQL) нетParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

Триггеры DDL активируются в ответ на различные события языка DDL.DDL triggers fire in response to a variety of Data Definition Language (DDL) events. Эти события в основном соответствуют инструкциям Transact-SQLTransact-SQL , которые начинаются с ключевых слов CREATE, ALTER, DROP, GRANT, DENY, REVOKE или UPDATE STATISTICS.These events primarily correspond to Transact-SQLTransact-SQL statements that start with the keywords CREATE, ALTER, DROP, GRANT, DENY, REVOKE or UPDATE STATISTICS. Системные хранимые процедуры, выполняющие операции, подобные операциям DDL, также могут запускать триггеры DDL.Certain system stored procedures that perform DDL-like operations can also fire DDL triggers.

Используйте триггеры DDL, если хотите сделать следующее.Use DDL triggers when you want to do the following:

  • Предотвращать внесение определенных изменений в схему базы данных.Prevent certain changes to your database schema.

  • Настроить выполнение в базе данных некоторых действий в ответ на изменения в схеме базы данных.Have something occur in the database in response to a change in your database schema.

  • Записывать изменения или события схемы базы данных.Record changes or events in the database schema.

Важно!

Тестировать триггеры DDL, чтобы определить, как они отвечают на запущенные системные хранимые процедуры.Test your DDL triggers to determine their responses to system stored procedures that are run. Например: как инструкция CREATE TYPE, так и хранимая процедура sp_addtype вызывают срабатывание триггера DDL, созданного на событии CREATE_TYPE.For example, the CREATE TYPE statement and the sp_addtype stored procedure will both fire a DDL trigger that is created on a CREATE_TYPE event.

Типы триггеров DDLTypes of DDL Triggers

Триггер DDL языка Transact-SQLTransact-SQL DDL Trigger

Хранимая процедура Transact-SQLTransact-SQL особого типа, которая выполняет одну или несколько инструкций Transact-SQLTransact-SQL в ответ на событие из области действия сервера или базы данных.A special type of Transact-SQLTransact-SQL stored procedure that executes one or more Transact-SQLTransact-SQL statements in response to a server-scoped or database-scoped event. Например, триггер DDL может активироваться, если выполняется такая инструкция, как ALTER SERVER CONFIGURATION, или если происходит удаление таблицы с использованием команды DROP TABLE.For example, a DDL Trigger may fire if a statement such as ALTER SERVER CONFIGURATION is executed or if a table is deleted by using DROP TABLE.

Триггер DDL среды CLRCLR DDL Trigger

Вместо вызова хранимой процедуры на языке Transact-SQLTransact-SQL триггер CLR вызывает один или несколько методов управляемого кода, являющихся членами сборки, созданной с помощью среды .NET Framework и загружены в SQL ServerSQL Server.Instead of executing a Transact-SQLTransact-SQL stored procedure, a CLR trigger executes one or more methods written in managed code that are members of an assembly created in the .NET Framework and uploaded in SQL ServerSQL Server.

Триггеры DDL срабатывают только после выполнения соответствующих инструкций DDL.DDL triggers fire only after the DDL statements that trigger them are run. Триггеры DDL нельзя использовать в качестве триггеров INSTEAD OF.DDL triggers cannot be used as INSTEAD OF triggers. Триггеры DDL не срабатывают в ответ на события, влияющие на локальные или глобальные временные таблицы и хранимые процедуры.DDL triggers do not fire in response to events that affect local or global temporary tables and stored procedures.

Триггеры DDL не создают специальные таблицы inserted и deleted .DDL triggers do not create the special inserted and deleted tables.

Сведения о событии, приведшем к срабатыванию триггера DDL, и последующих изменениях, выполненных триггером, можно получить при помощи функции EVENTDATA.The information about an event that fires a DDL trigger, and the subsequent changes caused by the trigger, is captured by using the EVENTDATA function.

Для каждого события DDL должно быть создано несколько триггеров.Multiple triggers to be created for each DDL event.

В отличие от триггеров DML, триггеры DDL не ограничены областью схемы.Unlike DML triggers, DDL triggers are not scoped to schemas. Поэтому для запроса метаданных о триггерах DDL нельзя воспользоваться такими функциями как OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY и OBJECTPROPERTYEX.Therefore, functions such as OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY, and OBJECTPROPERTYEX cannot be used for querying metadata about DDL triggers. Используйте вместо них представления каталога.Use the catalog views instead.

Триггеры DDL сервера появляются в обозревателе объектов среды SQL Server Management Studio в папке Triggers .Server-scoped DDL triggers appear in the SQL Server Management Studio Object Explorer in the Triggers folder. Эта папка находится под папкой Объекты сервера .This folder is located under the Server Objects folder. Триггеры DDL, доступные в области базы данных, находятся в папке Триггеры базы данных .Database-scoped DDL triggers appear in the Database Triggers folder. Эта папка находится в папке Программирование соответствующей базы данных.This folder is located under the Programmability folder of the corresponding database.

Важно!

Вредоносный программный код внутри триггеров может быть запущен с расширенными правами доступа.Malicious code inside triggers can run under escalated privileges. Дополнительные сведения о том, как уменьшить эту угрозу, см. в статье Управление безопасностью триггеров.For more information about how to help reduce this threat, see Manage Trigger Security.

Область действия триггера DDLDDL Trigger Scope

Триггеры DLL срабатывают в ответ на событие Transact-SQLTransact-SQL , обработанное текущей базой данных или текущим сервером.DDL triggers can fire in response to a Transact-SQLTransact-SQL event processed in the current database, or on the current server. Область триггера зависит от события.The scope of the trigger depends on the event. Например, триггер DDL, созданный для срабатывания на событие CREATE TABLE, может срабатывать каждый раз, когда в базе данных или в экземпляре сервера возникает событие CREATE_TABLE.For example, a DDL trigger created to fire in response to a CREATE_TABLE event can do so whenever a CREATE_TABLE event occurs in the database, or on the server instance. Триггер DDL, созданный для запуска в ответ на событие CREATE_LOGIN, может выполнять это только при возникновении события CREATE_LOGIN в экземпляре сервера.A DDL trigger created to fire in response to a CREATE_LOGIN event can do so only when a CREATE_LOGIN event occurs in the server instance.

В следующем примере триггер DDL safety будет срабатывать каждый раз, когда в базе данных будет выполняться инструкция DROP_TABLE или происходить событие ALTER_TABLE .In the following example, DDL trigger safety will fire whenever a DROP_TABLE or ALTER_TABLE event occurs in the database.

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 .In the following example, a DDL trigger prints a message if any CREATE_DATABASE event occurs on the current server instance. В этом примере используется функция EVENTDATA для получения текста соответствующей инструкции Transact-SQLTransact-SQL .The example uses the EVENTDATA function to retrieve the text of the corresponding Transact-SQLTransact-SQL statement. Дополнительные сведения об использовании EVENTDATA с триггерами DDL см. в статье Использование функции EVENTDATA.For more information about how to use EVENTDATA with DDL triggers, see Use the EVENTDATA Function.

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-SQLTransact-SQL соответствующим областям можно найти по ссылкам в подразделе «Выбор определенной инструкции DDL для запуска триггера DDL» далее в этом разделе.The lists that map the Transact-SQLTransact-SQL statements to the scopes that can be specified for them are available through the links provided in the section "Selecting a Particular DDL Statement to Fire a DDL Trigger," later in this topic.

Триггеры DDL масштаба базы данных хранятся как объекты в базах данных, в которых они создаются.Database-scoped DDL triggers are stored as objects in the database in which they are created. Триггеры DDL можно создавать и в базе данных master , и они будут работать точно так же, как триггеры, созданные в пользовательских базах данных.DDL triggers can be created in the master database and behave just like those created in user-designed databases. Чтобы получить сведения о триггерах DDL, можно послать запрос к представлению каталога sys.triggers .You can obtain information about DDL triggers by querying the sys.triggers catalog view. Запрос к sys.triggers можно выполнить в контексте базы данных, где были созданы триггеры. Или можно задать имя базы данных в качестве идентификатора, например master.sys.triggers.You can query sys.triggers within the database context in which the triggers are created or by specifying the database name as an identifier, such as master.sys.triggers.

Триггеры DDL масштаба триггера хранятся как объекты в базе данных master .Server-scoped DDL triggers are stored as objects in the master database. Однако для получения сведений о триггерах DDL сервера можно направить запрос к представлению каталога sys.server_triggers в любом контексте базы данных.However, you can obtain information about server-scoped DDL triggers by querying the sys.server_triggers catalog view in any database context.

Определение инструкции или группы инструкций Transact-SQLSpecifying a Transact-SQL Statement or Group of Statements

Выбор определенной инструкции DDL для запуска триггера DDLSelecting a Particular DDL Statement to Fire a DDL Trigger

Триггеры DDL могут срабатывать после выполнения одной или нескольких определенных инструкций Transact-SQLTransact-SQL .DDL triggers can be designed to fire after one or more particular Transact-SQLTransact-SQL statements are run. В предыдущем примере триггер safety срабатывает после любого события DROP_TABLE или ALTER_TABLE .In the previous example, trigger safety fires after any DROP_TABLE or ALTER_TABLE event. Списки инструкций Transact-SQLTransact-SQL , которые можно задать для запуска триггера DDL, а также область действия триггера см. в статье События DDL.For lists of the Transact-SQLTransact-SQL statements that can be specified to fire a DDL trigger, and the scope at which the trigger can fire, see DDL Events.

Выбор предопределенной группы инструкций DDL для запуска триггера DDLSelecting a Predefined Group of DDL Statements to Fire a DDL Trigger

Триггер DDL может срабатывать после любого события Transact-SQLTransact-SQL из заданной группы схожих событий.A DDL trigger can fire after execution of any Transact-SQLTransact-SQL event that belongs to a predefined grouping of similar events. Например, если нужно, чтобы триггер DDL срабатывал после выполнения любой инструкции CREATE TABLE, ALTER TABLE или DROP TABLE, можно указать FOR DDL_TABLE_EVENTS в инструкции CREATE TRIGGER.For example, if you want a DDL trigger to fire after any CREATE TABLE, ALTER TABLE, or DROP TABLE statement is run, you can specify FOR DDL_TABLE_EVENTS in the CREATE TRIGGER statement. После выполнения CREATE TRIGGER события, входящие в группу событий, добавляются в представление каталога sys.trigger_events .After CREATE TRIGGER is run, the events that are covered by an event group are added to the sys.trigger_events catalog view.

В SQL Server 2005 (9.x)SQL Server 2005 (9.x), если триггер создается для группы событий, представление sys.trigger_events не содержит сведения о группе событий. Представление sys.trigger_events содержит сведения только об отдельных событиях, входящих в группу.In SQL Server 2005 (9.x)SQL Server 2005 (9.x), if a trigger is created on an event group, sys.trigger_events does not include information about the event group, sys.trigger_events includes information only about the individual events covered by that group. В SQL Server 2008SQL Server 2008 и более поздних версий представление sys.trigger_events хранит метаданные о группе событий, для которой создан триггер, а также о событиях, входящих в эту группу.In SQL Server 2008SQL Server 2008 and higher, sys.trigger_events persists metadata about the event group on which the triggers is created, and also about the individual events that the event group covers. Поэтому в SQL Server 2008SQL Server 2008 и более поздних версиях изменение событий, охваченных группами событий, не применяется к триггерам DDL, созданным в этих группах событий в SQL Server 2005 (9.x)SQL Server 2005 (9.x).Therefore, changes to the events that are covered by event groups in SQL Server 2008SQL Server 2008 and higher do not apply to DDL triggers that are created on those event groups in SQL Server 2005 (9.x)SQL Server 2005 (9.x).

Список стандартных групп инструкций DDL для триггеров DDL, инструкции, входящие в эти группы событий, а также области, где можно программировать эти группы событий, приводятся в разделе DDL Event Groups.For a list of the predefined groups of DDL statements that are available for DDL triggers, the particular statements the event groups cover, and the scopes at which these event groups can be programmed, see DDL Event Groups.

ЗадачаTask РазделTopic
Описывает, как создать, изменить, удалить или отключить триггеры DDL.Describes how to create, modify, delete or disable DDL triggers. Реализация триггеров DDLImplement DDL Triggers
Описывает, как создать триггер DDL CLR.Describes how to create a CLR DDL trigger. Создание триггеров CLRCreate CLR Triggers
Описывает, как возвратить сведения о триггерах DDL.Describes how to return information about DDL triggers. Получение сведений о триггерах DDLGet Information About DDL Triggers
Описывает, как возвратить сведения о событии, которое активирует триггер DDL с использованием функции EVENTDATA.Describes how to return information about an event that fires a DDL trigger by using the EVENTDATA function. Использование функции EVENTDATAUse the EVENTDATA Function
Описывает, как управлять безопасностью триггеров.Describes how to manage trigger security. Управление безопасностью триггеровManage Trigger Security

См. также:See Also

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