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.
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 no escopo do servidor ou no escopo do 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 carregados em 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 acionados 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 EVENTDATA
função 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 por meio dos links fornecidos na seção "Selecionando uma instrução DDL específica para disparar um gatilho DDL", posteriormente 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 serem disparados depois que uma ou mais instruções Transact-SQL específicas forem executadas. 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 acionado, consulte Eventos DDL.
Selecionando um grupo predefinido de instruções DDL para acionar um gatilho DDL
Um gatilho DDL pode ser acionado 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, 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 e em versões posteriores, o sys.trigger_events mantém 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 cobertos por grupos de eventos no SQL Server 2008 e superior não se aplicam a 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 DDL Event Groups.
Related Tasks
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
Gatilhos DML
Gatilhos de logon
CREATE TRIGGER (Transact-SQL)