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
Base de Dados SQL do Azure
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
O EVENTDATA captura os dados de CREATE_SCHEMA eventos, bem como a <schema_element> da definição correspondente CREATE SCHEMA , caso exista. Além disso, EVENTDATA reconhece a definição de <schema_element> como um evento separado. Assim, um gatilho DDL criado tanto num evento CREATE_SCHEMA como num evento representado pelo <schema_element> da CREATE SCHEMA definição pode devolver os mesmos dados de evento duas vezes, como os TSQLCommand dados. 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 triggers DDL tanto nos eventos CREATE_SCHEMA como nos <textos schema_element> de definições correspondentes CREATE SCHEMA , ou integre lógica na sua aplicação para que o mesmo evento não seja processado duas vezes.
ALTER TABLE e ALTER DATABASE Eventos
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 do evento ALTER_TABLE incluem os nomes das colunas, restrições ou gatilhos afetados pela ALTER TABLE instrução e a ação (criar, alterar, eliminar, ativar ou desativar) realizada sobre os objetos afetados. Os dados do evento ALTER_DATABASE incluem os nomes de quaisquer ficheiros ou grupos de ficheiros afetados pela ALTER DATABASE instrução e a ação (criar, alterar ou eliminar) realizada sobre os 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;
Depois, execute a seguinte ALTER TABLE afirmação 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.