Usar a função EVENTDATAUse the EVENTDATA Function

APLICA-SE A: simSQL Server simBanco de Dados SQL do Azure nãoAzure Synapse Analytics (SQL DW) nãoParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

As informações sobre um evento que aciona um disparador DDL são capturadas por meio da função EVENTDATA.Information about an event that fires a DDL trigger is captured by using the EVENTDATA function. Essa função retorna um valor xml .This function returns an xml value. O esquema XML contém informações sobre o seguinte:The XML schema includes information about the following:

  • A hora do evento.The time of the event.

  • A ID de processo do sistema (SPID) da conexão no momento da execução do gatilho.The System Process ID (SPID) of the connection when the trigger executed.

  • O tipo de evento que acionou o gatilho.The type of event that fired the trigger.

Dependendo do tipo de evento, o esquema poderá conter ainda outras informações, como o banco de dados em que o evento ocorreu, o objeto em relação ao qual ele ocorreu e a instrução Transact-SQLTransact-SQL do evento.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. Para obter mais informações, consulte DDL Triggers.For more information, see DDL Triggers.

Por exemplo, o seguinte disparador DDL é criado no banco de dados de exemplo AdventureWorks2012AdventureWorks2012 :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  
;  

Em seguida, é executada a seguinte instrução CREATE TABLE :The following CREATE TABLE statement is then run:

CREATE TABLE NewTable (Column1 int);

A instrução EVENTDATA() no gatilho DDL captura o texto da instrução CREATE TABLE , que não é permitida.The EVENTDATA() statement in the DDL trigger captures the text of the CREATE TABLE statement that is not allowed. Isso é feito pelo uso de uma instrução XQuery nos dados xml gerados por EVENTDATA e pela recuperação do elemento <CommandText>.This is achieved by using an XQuery statement against the xml data that is generated by EVENTDATA and retrieving the <CommandText> element. Para obter mais informações, veja Referência da linguagem XQuery (SQL Server).For more information, see XQuery Language Reference (SQL Server).

Cuidado

A EVENTDATA captura os dados de eventos CREATE_SCHEMA, bem como o <schema_element> da definição CREATE SCHEMA correspondente, se houver.EVENTDATA captures the data of CREATE_SCHEMA events as well as the <schema_element> of the corresponding CREATE SCHEMA definition, if any exists. Além disso, EVENTDATA reconhece a definição <schema_element>como um evento separado.Additionally, EVENTDATA recognizes the <schema_element> definition as a separate event. Portanto, um disparador DDL criado em ambos os eventos CREATE SCHEMA e um evento representado pelo <schema_element> da definição CREATE SCHEMA podem retornar os mesmos dados de evento duas vezes, como os dados de 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. Por exemplo, considere um disparador DDL criado em ambos os eventos CREATE_SCHEMA e CREATE_TABLE e a execução do seguinte lote: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)

Se o aplicativo recuperar os dados de TSQLCommand do evento CREATE_TABLE, lembre-se de que esses dados podem aparecer duas vezes: primeiro, quando ocorre o evento CREATE_SCHEMA e, outra vez, quando ocorre o evento 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. Evite criar disparadores DDL em ambos os eventos CREATE_SCHEMA e nos textos de <schema_element> de quaisquer definições CREATE SCHEMA correspondentes ou crie lógica em seu aplicativo para que o mesmo evento não seja processado duas vezes.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.

Eventos ALTER TABLE e ALTER DATABASEALTER TABLE and ALTER DATABASE Events

Os dados de eventos para os eventos ALTER_TABLE e ALTER_DATABASE também incluem os nomes e os tipos de outros objetos afetados pela instrução DDL e pela ação executada nesses objetos.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. Os dados do evento ALTER_TABLE incluem os nomes das colunas, as limitações os aciondores afetados pela instrução ALTER TABLE e a ação (criar, alterar, descartar, habilitar ou desabilitar) executada nesses objetos.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. Os dados do evento ALTER_DATABASE incluem os nomes de qualquer arquivo ou grupos de arquivos afetados pela instução ALTER DATABASE e a ação (criar, alterar, descartar) executada nos objetos afetados.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.

Por exemplo, crie o seguinte gatilho DDL no banco de dados de exemplo Adventure Works: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;  

Então execute a instrução ALTER TABLE seguinte que viola uma restrição:Then execute the following ALTER TABLE statement that violates a constraint:

ALTER TABLE Person.Address ALTER COLUMN ModifiedDate date;   

A instrução EVENTDATA() no gatilho DDL captura o texto da instrução ALTER TABLE , que não é permitida.The EVENTDATA() statement in the DDL trigger captures the text of the ALTER TABLE statement that is not permitted.

ExemploExample

Você pode usar a função EVENTDATA para criar um log de eventos.You can use the EVENTDATA function to create a log of events. No exemplo a seguir, é criada uma tabela para armazenar informações de evento.In the following example, a table is created to store event information. Em seguida, é criado um disparador DDL no banco de dados atual que popula a tabela com as seguintes informações, sempre que ocorre algum evento DDL em nível de banco de dados: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:

  • A hora do evento (usando a função GETDATE).The time of the event (using the GETDATE function).

  • O usuário de banco de dados em relação ao qual ocorreu o evento (usando a função CURRENT_USER).The database user against whose session the event occurred (using the CURRENT_USER function).

  • O tipo de evento.The type of the event.

  • A instrução Transact-SQLTransact-SQL que capturou o evento.The Transact-SQLTransact-SQL statement that comprised the event.

Outra vez, os últimos dois itens são capturados com o XQuery nos dados xml gerados por 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  

Observação

Para retornar dados de evento, recomenda-se usar o método value() do XQuery em vez do método query() .To return event data, we recommend that you use the XQuery value() method instead of the query() method. O método query() retorna instâncias XML e CRLF (retorno de carro e alimentação de linha) com escape com E comercial na saída, enquanto o método value() renderiza instâncias CRLF invisíveis na saída.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.

Um exemplo similar de disparador DDL é fornecido com o banco de dados de exemplo AdventureWorks2012AdventureWorks2012 .A similar DDL trigger example is provided with the AdventureWorks2012AdventureWorks2012 sample database. Para obter o exemplo, localize a pasta Gatilhos de Banco de Dados, usando o 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. Esta pasta está localizada na pasta Programação do banco de dados AdventureWorks2012AdventureWorks2012 .This folder is located under the Programmability folder of the AdventureWorks2012AdventureWorks2012 database. Clique com o botão direito do mouse em ddlDatabaseTriggerLog e selecione Script de Gatilho de Banco de Dados como.Right-click ddlDatabaseTriggerLog and select Script Database Trigger as. Por padrão, o gatilho DDL ddlDatabaseTriggerLog está desabilitado.By default, DDL trigger ddlDatabaseTriggerLog is disabled.

Consulte TambémSee Also

Eventos DDL DDL Events
Grupos de eventos DDLDDL Event Groups