Criando gatilhos DDL

Para poder criar um disparador DDL, é necessário o seguinte:

  • Compreender o escopo do disparador DDL.

  • Determinar qual instrução Transact-SQL ou grupo de instruções aciona o gatilho.

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

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

ObservaçãoObservação

Os disparadores DDL não são acionados em resposta a eventos que afetem tabelas temporárias locais ou globais e procedimentos armazenados.

Compreendendo o escopo do gatilho

Os disparadores DDL podem ser acionados 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 disparador 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 disparador DDL criado para ser acionado em resposta a um evento CREATE_LOGIN poderá sê-lo apenas quando um evento CREATE_LOGIN ocorrer no servidor.

No exemplo a seguir, o disparador DDL safety será acionado 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 disparador 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 disparadores DDL, consulte Usando 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 disparador DDL", mais adiante, neste tópico.

Os disparadores DDL com escopo de banco de dados são armazenados como objetos no banco de dados em que são criados. Os disparadores 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 disparadores 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 disparadores DDL com escopo de servidor são armazenados como objetos no banco de dados mestre. É possível, contudo, obter informações sobre disparadores DDL com escopo de servidor consultando a exibição de catálogo sys.server_triggers no contexto de qualquer banco de dados.

Para obter mais informações sobre como recuperar metadados de disparadores DDL, consulte Obtendo informações sobre gatilhos DDL.

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

Podem ser criados disparadores DDL com acionamento em resposta a uma ou mais instruções DDL em particular ou a um grupo de instruções DDL predefinido.

Selecionando uma instrução DDL em particular para acionar um disparador DDL

É possível designar que os disparadores DDL sejam acionados mediante 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 disparador 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 disparador DDL

Um disparador 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 disparador 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.

ObservaçãoObservação

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, sys.trigger_events persiste metadados sobre o grupo de eventos no qual são criados os gatilhos e, também, sobre os eventos individuais compreendidos pelo grupo de eventos. Logo, as alterações a eventos compreendidos por grupos de eventos no SQL Server 2008 não se aplicam aos disparadores DDL criados nesses grupos no SQL Server 2005.

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