Gatilhos DDL

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do Azure

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.

Importante

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 escritos 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 afetem 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 do 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 . Os gatilhos DDL com escopo de banco de dados aparecem na pasta Database Triggers . Essa pasta fica localizada na pasta Programmability do banco de dados correspondente.

Importante

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 atual 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  
  

As listas que mapeiam as instruções Transact-SQL para os escopos que podem ser especificados para elas estão disponíveis nos links fornecidos na seção "Seleção de uma determinada instrução DDL para disparar 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

Os gatilhos DDL podem ser projetados para acionamento após a execução de uma ou mais instruções Transact-SQL específicas. No exemplo anterior, o gatilho safety é acionado mediante qualquer evento DROP_TABLE ou ALTER_TABLE . Para obter listas das instruções Transact-SQL que podem ser especificadas para disparar um gatilho DDL e o escopo no qual o gatilho pode ser disparado, consulte Eventos DDL.

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

Um gatilho DDL pode ser disparado após a execução de qualquer evento Transact-SQL que pertença a um agrupamento predefinido de eventos semelhantes. 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 (9.x), se um gatilho for criado em um grupo de eventos, sys.trigger_events não incluirá informações sobre o grupo de eventos; sys.trigger_events incluirá informações apenas sobre os eventos individuais cobertos por esse grupo. No SQL Server 2008 (10.0.x) e superior, sys.trigger_events persiste os metadados sobre o grupo de eventos no qual os gatilhos são criados e também sobre os eventos individuais que o grupo de eventos abrange. Portanto, as alterações nos eventos que são cobertos por grupos de eventos no SQL Server 2008 (10.0.x) e superiores não se aplicam aos gatilhos DDL criados nesses grupos de eventos no SQL Server 2005 (9.x).

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 DDL Event Groups.

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

Confira também

Gatilhos DML
Gatilhos de logon
CREATE TRIGGER (Transact-SQL)
EVENTDATA (Transact-SQL)