Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Base de dados SQL no Microsoft Fabric
As informações sobre um evento que dispara um gatilho DDL são capturadas usando a função EVENTDATA. Esta função retorna um valor xml de. O esquema XML inclui informações sobre o seguinte:
A hora do evento.
A ID de sessão (SPID) da conexão quando o gatilho foi executado.
O tipo de evento que disparou o gatilho.
Dependendo do tipo de evento, o esquema inclui informações adicionais, como o banco de dados no qual o evento ocorreu, o objeto contra o qual o evento ocorreu e a instrução Transact-SQL do evento. Para obter mais informações, consulte DDL Triggers.
Por exemplo, o seguinte gatilho DDL é criado no banco de dados de exemplo AdventureWorks2025:
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
;
A seguinte instrução CREATE TABLE é então executada:
CREATE TABLE NewTable (Column1 int);
A instrução EVENTDATA() no gatilho DDL captura o texto da instrução CREATE TABLE que não é permitida. Isso é conseguido usando uma instrução XQuery em relação aos dados de xml gerados por EVENTDATA e recuperando o elemento< CommandText >. Para obter mais informações, consulte XQuery Language Reference (SQL Server).
Atenção
EVENTDATA captura os dados de eventos CREATE_SCHEMA, bem como o <schema_element> da definição CREATE SCHEMA correspondente, se existir. Além disso, EVENTDATA reconhece a definição de <schema_element> como um evento separado. Portanto, um gatilho DDL criado em um evento CREATE_SCHEMA e um evento representado pelo <schema_element> da definição CREATE SCHEMA pode retornar os mesmos dados de evento duas vezes, como os dados TSQLCommand. Por exemplo, considere um gatilho DDL criado nos eventos CREATE_SCHEMA e CREATE_TABLE e o seguinte lote é executado:
CREATE SCHEMA s
CREATE TABLE t1 (col1 int)
Se o aplicativo recuperar os dados de TSQLCommand do evento CREATE_TABLE, esteja ciente de que esses dados podem aparecer duas vezes: uma vez quando o evento CREATE_SCHEMA ocorre e novamente quando o evento CREATE_TABLE ocorre. Evite criar gatilhos DDL nos eventos CREATE_SCHEMA e nos textos <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.
Eventos ALTER TABLE e ALTER DATABASE
Os dados de evento para os eventos ALTER_TABLE e ALTER_DATABASE também incluem os nomes e tipos de outros objetos afetados pela instrução DDL e a ação executada nesses objetos. Os dados de evento ALTER_TABLE incluem os nomes das colunas, restrições ou gatilhos afetados pela instrução ALTER TABLE e a ação (criar, alterar, descartar, habilitar ou desabilitar) executada nos objetos afetados. Os dados de evento ALTER_DATABASE incluem os nomes de quaisquer arquivos ou grupos de arquivos afetados pela instrução ALTER DATABASE e a ação (criar, alterar ou soltar) executada nos objetos afetados.
Por exemplo, crie o seguinte gatilho DDL no banco de dados de exemplo AdventureWorks:
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;
Em seguida, execute a seguinte instrução ALTER TABLE que viola uma restrição:
ALTER TABLE Person.Address ALTER COLUMN ModifiedDate date;
A instrução EVENTDATA() no disparador DDL captura o texto da instrução ALTER TABLE que não é permitida.
Exemplo
Você pode usar a função EVENTDATA para criar um log de eventos. No exemplo a seguir, uma tabela é criada para armazenar informações de eventos. Um gatilho DDL é então criado no banco de dados atual que preenche a tabela com as seguintes informações sempre que ocorrer qualquer evento DDL no nível do banco de dados:
A hora do evento (usando a função GETDATE).
O usuário do banco de dados em cuja sessão o evento ocorreu (usando a função CURRENT_USER).
O tipo de evento.
A Transact-SQL declaração que compôs o evento.
Novamente, os dois últimos itens são capturados usando XQuery em relação aos xml dados gerados por EVENTDATA.
USE AdventureWorks2022;
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, recomendamos que você use o método value() XQuery em vez do método query(). O método query() retorna instâncias XML e CRLF (retorno de carro e alimentação de linha) na saída, enquanto o método value() de torna as instâncias CRLF invisíveis na saída.
Um exemplo de gatilho DDL semelhante é fornecido com o banco de dados de exemplo AdventureWorks2025. Para obter o exemplo, localize a pasta Gatilhos de Banco de Dados usando o SQL Server Management Studio. Esta pasta encontra-se na pasta Programmability da base de dados AdventureWorks2025. Clique com o botão direito ddlDatabaseTriggerLog e selecione Script Database Trigger como. Por padrão, o trigger DDL ddlDatabaseTriggerLog está desativado.