Использование функции EVENTDATAUse the EVENTDATA Function

ОБЛАСТЬ ПРИМЕНЕНИЯ: да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

Функция EVENTDATA позволяет получить сведения о событии, которое привело к срабатыванию триггера DDL.Information about an event that fires a DDL trigger is captured by using the EVENTDATA function. Эта функция возвращает значение типа xml .This function returns an xml value. XML-схема содержит следующие сведения:The XML schema includes information about the following:

  • время формирования события;The time of the event.

  • идентификатор системного процесса (SPID), соответствующий соединению, во время которого был выполнен триггер;The System Process ID (SPID) of the connection when the trigger executed.

  • тип события, которое привело к срабатыванию триггера.The type of event that fired the trigger.

В зависимости от типа события эта схема включает также дополнительные сведения о базе данных, в которой было сформировано событие, об объекте, в контексте которого оно было сформировано, и об инструкции Transact-SQLTransact-SQL , вызвавшей это событие.Depending on the event type, the schema then includes additional information such as the database in which the event occurred, the object against which the event occurred, and the Transact-SQLTransact-SQL statement of the event. Дополнительные сведения см. в разделе DDL Triggers.For more information, see DDL Triggers.

Предположим, что в базе данных AdventureWorks2012AdventureWorks2012 создан следующий триггер DDL:For example, the following DDL trigger is created in the AdventureWorks2012AdventureWorks2012 sample database:

CREATE TRIGGER safety   
ON DATABASE   
FOR CREATE_TABLE   
AS   
    PRINT 'CREATE TABLE Issued.'  
    SELECT EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')  
   RAISERROR ('New tables cannot be created in this database.', 16, 1)   
   ROLLBACK  
;  

После этого выполняется следующая инструкция CREATE TABLE :The following CREATE TABLE statement is then run:

CREATE TABLE NewTable (Column1 int);

Инструкция EVENTDATA() в триггере DDL захватывает текст инструкции CREATE TABLE , что является недопустимым.The EVENTDATA() statement in the DDL trigger captures the text of the CREATE TABLE statement that is not allowed. Это достигается путем выполнения запроса XQuery к данным типа xml, порожденным функцией EVENTDATA, и получения элемента <CommandText>.This is achieved by using an XQuery statement against the xml data that is generated by EVENTDATA and retrieving the <CommandText> element. Дополнительные сведения см. в статье Справочник по языку XQuery (SQL Server).For more information, see XQuery Language Reference (SQL Server).

Внимание!

Функция EVENTDATA захватывает данные событий CREATE_SCHEMA, а также элемента <schema_element> соответствующего определения CREATE SCHEMA, если таковые существуют.EVENTDATA captures the data of CREATE_SCHEMA events as well as the <schema_element> of the corresponding CREATE SCHEMA definition, if any exists. Кроме этого, функция EVENTDATA распознает определение <schema_element> как отдельное событие.Additionally, EVENTDATA recognizes the <schema_element> definition as a separate event. Таким образом, триггер DDL, созданный для события CREATE_SCHEMA и для события, представленного данными <schema_element> определения CREATE SCHEMA, может дважды вернуть одни и те же сведения о событии (например, данные TSQLCommand).Therefore, a DDL trigger created on both a CREATE_SCHEMA event, and an event represented by the <schema_element> of the CREATE SCHEMA definition, may return the same event data twice, such as the TSQLCommand data. Допустим, для событий CREATE_SCHEMA и CREATE_TABLE создан триггер DDL и выполняется следующий пакет:For example, consider a DDL trigger that is created on both the CREATE_SCHEMA and CREATE_TABLE events and the following batch is run:

CREATE SCHEMA s

CREATE TABLE t1 (col1 int)

Если приложение использует данные TSQLCommand о событии CREATE_TABLE, следует учитывать, что эти данные могут появиться дважды: при возникновении события CREATE_SCHEMA и при возникновении события CREATE_TABLE.If the application retrieves the TSQLCommand data of the CREATE_TABLE event, be aware that this data may appear two times: once when the CREATE_SCHEMA event occurs, and again when the CREATE_TABLE event occurs. Следует избегать создания триггеров DDL одновременно для событий CREATE_SCHEMA и текста <schema_element> для любых соответствующих определений CREATE SCHEMA, или же в приложение необходимо добавить элемент логики, чтобы одно и тоже событие не обрабатывалось дважды.Avoid creating DDL triggers on both the CREATE_SCHEMA events and the <schema_element> texts of any corresponding CREATE SCHEMA definitions, or build logic into your application so that the same event is not processed twice.

События ALTER TABLE и ALTER DATABASEALTER TABLE and ALTER DATABASE Events

Данные о событиях для событий ALTER_TABLE и ALTER_DATABASE также включают имена и типы других объектов, затронутых DDL-инструкцией и действием, выполняемым над этими объектами.The event data for the ALTER_TABLE and ALTER_DATABASE events also includes the names and types of other objects affected by the DDL statement and the action performed on these objects. Данные события ALTER_TABLE включают имена столбцов, ограничений или триггеров, затронутых инструкцией ALTER TABLE и действием (создание, изменение, удаление, включение или отключение), выполняемым над затронутыми объектами.The ALTER_TABLE event data includes the names of the columns, constraints, or triggers affected by the ALTER TABLE statement and the action (create, alter, drop, enable, or disable) performed on the affected objects. Данные события ALTER_DATABASE включают имена любых файлов или файловых групп, затронутых инструкцией ALTER DATABASE и действием (создание, изменение, удаление), выполняемым над затронутыми объектами.The ALTER_DATABASE event data includes the names of any files or filegroups affected by the ALTER DATABASE statement and the action (create, alter, or drop) performed on the affected objects.

Предположим, что в образце базы данных AdventureWorks создан следующий триггер DDL:For example, create the following DDL trigger in the AdventureWorks sample database:

CREATE TRIGGER ColumnChanges  
ON DATABASE   
FOR ALTER_TABLE  
AS  
-- Detect whether a column was created/altered/dropped.  
SELECT EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]', 'nvarchar(max)')  
RAISERROR ('Table schema cannot be modified in this database.', 16, 1);  
ROLLBACK;  

Затем выполняется следующая инструкция ALTER TABLE, нарушающая ограничение:Then execute the following ALTER TABLE statement that violates a constraint:

ALTER TABLE Person.Address ALTER COLUMN ModifiedDate date;   

Инструкция EVENTDATA() в триггере DDL захватывает текст инструкции ALTER TABLE , что является недопустимым.The EVENTDATA() statement in the DDL trigger captures the text of the ALTER TABLE statement that is not permitted.

ПримерExample

Функция EVENTDATA может применяться для создания журнала событий.You can use the EVENTDATA function to create a log of events. В следующем примере создается таблица для хранения информации о событиях.In the following example, a table is created to store event information. После этого для текущей базы данных создается триггер DDL, который при любом событии DDL уровня базы данных заполняет эту таблицу следующими данными:A DDL trigger is then created on the current database that populates the table with the following information whenever any database-level DDL event occurs:

  • время формирования события (функция GETDATE);The time of the event (using the GETDATE function).

  • пользователь базы данных, инициировавший сеанс, во время которого произошло событие (функция CURRENT_USER);The database user against whose session the event occurred (using the CURRENT_USER function).

  • тип события;The type of the event.

  • инструкция Transact-SQLTransact-SQL , вызвавшая данное событие.The Transact-SQLTransact-SQL statement that comprised the event.

Сведения о двух последних элементах регистрируются путем выполнения запроса XQuery для xml -данных, сформированных функцией EVENTDATA.Again, the last two items are captured by using XQuery against the xml data that is generated by EVENTDATA.

USE AdventureWorks2012;  
GO  
CREATE TABLE ddl_log (PostTime datetime, DB_User nvarchar(100), Event nvarchar(100), TSQL nvarchar(2000));  
GO  
CREATE TRIGGER log   
ON DATABASE   
FOR DDL_DATABASE_LEVEL_EVENTS   
AS  
DECLARE @data XML  
SET @data = EVENTDATA()  
INSERT ddl_log   
   (PostTime, DB_User, Event, TSQL)   
   VALUES   
   (GETDATE(),   
   CONVERT(nvarchar(100), CURRENT_USER),   
   @data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)'),   
   @data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(2000)') ) ;  
GO  
--Test the trigger  
CREATE TABLE TestTable (a int)  
DROP TABLE TestTable ;  
GO  
SELECT * FROM ddl_log ;  
GO  

Примечание

Для возврата данных о событии рекомендуется использовать метод XQuery value() , а не query() .To return event data, we recommend that you use the XQuery value() method instead of the query() method. Метод query() возвращает XML-данные, содержащие символы возврата каретки и переноса строки (CR/LF), отделенные амперсандом, а метод value() не отображает эти символы.The query() method returns XML and ampersand-escaped carriage return and line-feed (CRLF) instances in the output, while the value() method renders CRLF instances invisible in the output.

Аналогичный пример триггера DDL предоставляется вместе с образцом базы данных AdventureWorks2012AdventureWorks2012 .A similar DDL trigger example is provided with the AdventureWorks2012AdventureWorks2012 sample database. Для его получения перейдите в среде SQL Server Management StudioSQL Server Management Studioв папку с триггерами базы данных,To obtain the example, locate the Database Triggers folder by using SQL Server Management StudioSQL Server Management Studio. Эта папка находится в папке Programmability базы данных AdventureWorks2012AdventureWorks2012 .This folder is located under the Programmability folder of the AdventureWorks2012AdventureWorks2012 database. Щелкните правой кнопкой мыши ddlDatabaseTriggerLog и выберите команду Создать скрипт для триггера базы данных.Right-click ddlDatabaseTriggerLog and select Script Database Trigger as. По умолчанию триггер DDL ddlDatabaseTriggerLog отключен.By default, DDL trigger ddlDatabaseTriggerLog is disabled.

См. также:See Also

DDL-события DDL Events
Группы DDL-событийDDL Event Groups