Gatilhos DDL

Os gatilhos DDL são disparados em resposta a diversos eventos DDL (linguagem de definição de dados). Esses eventos correspondem principalmente a instruções Transact-SQL que começam com as palavras-chave CREATE, ALTER, DROP, GRANT, DENY, REVOKE ou UPDATE STATISTICS. Determinados procedimentos armazenados do sistema que executam operações do tipo DDL também podem disparar gatilhos DDL.

Use gatilhos DDL quando quiser fazer o seguinte:

  • Evitar determinadas alterações em seu esquema de banco de dados.

  • Ocorrer algo no banco de dados em resposta a uma alteração em seu esquema de banco de dados.

  • Registrar alterações ou eventos no esquema de banco de dados.

Observação importanteImportante

Teste seus gatilhos DDL para determinar suas respostas aos procedimentos armazenados do sistema que são executados. Por exemplo, a instrução CREATE TYPE e o procedimento armazenado sp_addtype dispararão um gatilho DDL criado em um evento CREATE_TYPE.

Tipos de gatilhos DDL

  • Gatilho DDL Transact-SQL
    Um tipo especial de procedimento armazenado Transact-SQL que executa uma ou mais instruções Transact-SQL em resposta a um evento com escopo de servidor ou de banco de dados. Por exemplo, um Gatilho DDL poderá ser disparado se uma instrução como ALTER SERVER CONFIGURATION for executada ou se uma tabela for excluída usando DROP TABLE.

  • Gatilho DDL CLR
    Em vez de executar um procedimento armazenado Transact-SQL, um gatilho CLR executa um ou mais métodos gravados em código gerenciado que são membros de um assembly criado no .NET Framework e carregado no SQL Server.

Os gatilhos DDL são disparados somente após a execução das instruções DDL que os dispararam. Os gatilhos DDL não podem ser usados como gatilhos INSTEAD OF. Os gatilhos DDL não são disparados em resposta a eventos que afetam tabelas temporárias locais ou globais e procedimentos armazenados.

Os gatilhos DDL não criam as tabelas especiais inserted e deleted.

As informações sobre um evento que dispara um gatilho DDL e as alterações subsequentes causadas pelo gatilho são capturadas por meio da função EVENTDATA.

Vários gatilhos a serem criados para cada evento DDL.

Diferentemente dos gatilhos DML, os gatilhos DDL não têm seu escopo definido para esquemas. Portanto, funções como OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY e OBJECTPROPERTYEX não podem ser usadas para consultar metadados sobre gatilhos DDL. Use as exibições de catálogo em vez disso.

Os gatilhos DDL com escopo de servidor aparecem no Pesquisador de Objetos do SQL Server Management Studio na pasta Triggers. Essa pasta está localizada na pasta Server Objects. Gatilhos DDL definidos por banco de dados aparecem na pasta Database Triggers. Essa pasta está localizada na pasta Programmability do banco de dados correspondente.

Observação sobre segurançaObservação sobre segurança

Um código mal-intencionado dentro de gatilhos pode ser executado sob privilégios escalonados. Para obter mais informações sobre como ajudar a reduzir essa ameaça, consulte Gerenciar a segurança dos gatilhos.

Escopo do gatilho DDL

Os gatilhos DDL podem ser disparados em resposta a um evento Transact-SQL processado no banco de dados ou no servidor atual. O escopo do gatilho depende do evento. Por exemplo, um gatilho DDL criado para ser acionado em resposta a um evento CREATE_TABLE poderá sê-lo sempre que um evento CREATE_TABLE ocorrer no banco de dados ou na instância do servidor. Um gatilho DDL criado para ser disparado em resposta a um evento CREATE_LOGIN só poderá sê-lo quando um evento CREATE_LOGIN ocorrer na instância do servidor.

No exemplo a seguir, o gatilho DDL safety será disparado sempre que um evento DROP_TABLE ou ALTER_TABLE ocorrer no banco de dados.

CREATE TRIGGER safety 
ON DATABASE 
FOR DROP_TABLE, ALTER_TABLE 
AS 
   PRINT 'You must disable Trigger "safety" to drop or alter tables!' 
   ROLLBACK;

No exemplo a seguir, um gatilho DDL imprimirá uma mensagem caso ocorra algum evento CREATE_DATABASE na instância de servidor atual. O exemplo usa a função EVENTDATA para recuperar o texto da instrução Transact-SQL correspondente. Para obter mais informações sobre como usar EVENTDATA com gatilhos DDL, consulte Usar a função EVENTDATA.

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

A lista que mapeia as instruções Transact-SQL para os escopos que podem ser especificados para elas está disponível através dos links fornecidos na seção "Selecionando uma instrução DDL em particular para acionar um gatilho DDL", mais adiante, neste tópico.

Os gatilhos DDL com escopo de banco de dados são armazenados como objetos no banco de dados em que são criados. Os gatilhos DDL podem ser criados no banco de dados mestre e se comportam de forma idêntica àqueles criados em bancos de dados criados pelo usuário. Você pode obter informações sobre gatilhos DDL consultando a exibição de catálogo sys.triggers. Você pode consultar sys.triggers dentro do contexto do banco de dados em que foram criados os gatilhos ou especificar o nome do banco de dados como identificador, por exemplo, master.sys.triggers.

Os gatilhos DDL com escopo de servidor são armazenados como objetos no banco de dados mestre. É possível, contudo, obter informações sobre gatilhos DDL com escopo de servidor consultando a exibição de catálogo sys.server_triggers em qualquer contexto de banco de dados.

Especificando uma instrução ou grupo de instruções Transact-SQL

Selecionando uma instrução DDL em particular para disparar um gatilho DDL

É possível designar os gatilhos DDL para que sejam disparados após a execução de uma ou mais instruções Transact-SQL. No exemplo anterior, o gatilho safety é acionado mediante qualquer evento DROP_TABLE ou ALTER_TABLE. Para obter listas com as instruções Transact-SQL que podem ser especificadas para acionar um gatilho DDL e o escopo no qual o gatilho pode ser acionado, consulte Eventos DDL.

Selecionando um grupo predefinido de instruções DDL para acionar um gatilho DDL

Um gatilho DDL pode ser acionado mediante a execução de qualquer evento Transact-SQL pertencente a um grupo predefinido de eventos similares. Por exemplo, se desejar que um gatilho DDL seja acionado mediante a execução de uma instrução CREATE TABLE, ALTER TABLE ou DROP TABLE, você pode especificar FOR DDL_TABLE_EVENTS na instrução CREATE TRIGGER. Após a execução de CREATE TRIGGER, os eventos compreendidos pelo grupo de eventos serão adicionados à exibição de catálogo sys.trigger_events.

No SQL Server 2005, quando um gatilho é criado em um grupo de eventos, sys.trigger_events não contém informações sobre o grupo de eventos, mas somente sobre os eventos individuais compreendidos pelo grupo. No SQL Server 2008 e em versões posteriores, o sys.trigger_events mantém metadados sobre o grupo de eventos no qual são criados os gatilhos e, também, sobre os eventos individuais que o grupo de eventos abrange. Portanto, as alterações nos eventos compreendidos pelos grupos de eventos no SQL Server 2008 e em versões posteriores não se aplicam aos gatilhos DDL criados nesses grupos de eventos no SQL Server 2005.

Para obter uma lista de grupos predefinidos de instruções DDL disponíveis para gatilhos DDL, as instruções abarcadas pelos grupos de eventos e os escopos nos quais esses grupos de eventos podem ser programados, consulte Grupos de eventos DDL.

Tarefas relacionadas

Tarefa

Tópico

Descreve como criar, modificar, excluir ou desabilitar gatilhos DDL.

Implementar gatilhos DDL

Descreve como criar um gatilho DDL CLR.

Criar gatilhos CLR

Descreve como retornar informações sobre gatilhos DDL.

Obter informações sobre gatilhos DDL

Descreve como retornar informações sobre um evento que dispara um gatilho DDL por meio da função EVENTDATA.

Usar a função EVENTDATA

Descreve como gerenciar a segurança do gatilho.

Gerenciar a segurança dos gatilhos

Consulte também

Referência

CREATE TRIGGER (Transact-SQL)

Conceitos

Gatilhos DML

Gatilhos de logon