Partilhar via


Gatilhos DDL

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBase de dados SQL no Microsoft Fabric

DDL dispara fogo em resposta a vários eventos DDL (Data Definition Language). Esses eventos correspondem principalmente a Transact-SQL declarações que começam com as palavras-chave CREATE, ALTER, DROP, GRANT, DENY, REVOKE, ou UPDATE STATISTICS. Certos procedimentos armazenados do sistema que executam operações semelhantes a DDL também podem disparar gatilhos DDL.

Use gatilhos DDL quando quiser executar as seguintes tarefas:

  • Impeça determinadas alterações no esquema do banco de dados.
  • Fazer com que algo ocorra no banco de dados em resposta a uma alteração no esquema do banco de dados.
  • Registre alterações ou eventos no esquema do banco de dados.

Importante

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

Os tipos de trigger DDL

Transact-SQL gatilho

Um tipo especial de Transact-SQL procedimento armazenado 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 pode ser acionado se uma instrução como ALTER SERVER CONFIGURATION a for executada ou se uma tabela for excluída usando DROP TABLE.

Gatilho CLR

Em vez de executar um procedimento armazenado Transact-SQL, um gatilho CLR (Common Language Runtime) 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.

DDL aciona disparar somente depois que as instruções DDL que as acionam são executadas. Gatilhos DDL não podem ser usados como gatilhos INSTEAD OF. Os gatilhos DDL não são acionados 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 usando a EVENTDATA função.

Vários triggers devem ser criados para cada evento DDL.

Ao contrário dos gatilhos de Linguagem de Manipulação de Dados (DML), os gatilhos DDL não estão limitados a esquemas. Portanto, funções como OBJECT_ID, OBJECT_NAME, OBJECTPROPERTYe OBJECTPROPERTYEX não podem ser usadas para consultar metadados sobre gatilhos DDL. Em vez disso, use as exibições de catálogo.

Os gatilhos DDL com escopo de servidor aparecem no Pesquisador de Objetos do SQL Server Management Studio na pasta Triggers . Esta pasta está localizada na pasta Objetos do Servidor . Os gatilhos DDL com escopo de banco de dados aparecem na pasta Gatilhos de Banco de Dados . Esta pasta está localizada na pasta Programabilidade do banco de dados correspondente.

Importante

O 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 do gatilho.

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 disparar em resposta a um CREATE_TABLE evento pode fazê-lo sempre que um CREATE_TABLE evento ocorre no banco de dados ou na instância do servidor. Um gatilho DDL criado para disparar em resposta a um CREATE_LOGIN evento pode fazê-lo somente quando um CREATE_LOGIN evento ocorre na instância do servidor.

No exemplo a seguir, o gatilho DDL safety é acionado sempre que ocorre um evento DROP_TABLE ou um evento ALTER_TABLE 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 seguinte, um trigger DDL exibe uma mensagem se ocorrer qualquer evento CREATE_DATABASE na instância atual do servidor. 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;

As listas que mapeiam as instruções Transact-SQL para os escopos que podem ser especificados para elas estão disponíveis através dos links fornecidos na seção Selecione uma instrução DDL específica para disparar um gatilho DDL mais adiante neste artigo.

Os gatilhos DDL com escopo de banco de dados são armazenados como objetos no banco de dados no qual são criados. Os gatilhos master DDL podem ser criados no banco de dados e se comportam tal como aqueles criados em bancos de dados projetados pelo usuário. Você pode obter informações sobre gatilhos DDL consultando a vista de catálogo sys.triggers. Você pode consultar sys.triggers dentro do contexto do banco de dados no qual os gatilhos são criados ou especificando o nome do banco de dados como um identificador, como master.sys.triggers.

Os gatilhos master DDL com escopo de servidor são armazenados como objetos no banco de dados. No entanto, você pode obter informações sobre gatilhos DDL com escopo de servidor consultando a exibição de sys.server_triggers catálogo em qualquer contexto de banco de dados.

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

Selecione uma instrução DDL específica para disparar um gatilho DDL

Os gatilhos DDL podem ser projetados para disparar depois que uma ou mais instruções Transact-SQL específicas são executadas. No exemplo anterior, o gatilho safety dispara após 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.

Selecione um grupo predefinido de instruções DDL para disparar 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 pretender que um trigger DDL seja acionado após qualquer instrução CREATE TABLE, ALTER TABLE ou DROP TABLE ser executada, poderá especificar FOR DDL_TABLE_EVENTS na instrução CREATE TRIGGER. Depois que CREATE TRIGGER é executado, os eventos cobertos por um grupo de eventos são adicionados à vista 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á apenas informações sobre os eventos individuais cobertos por esse grupo. sys.trigger_events Persiste metadados sobre o grupo de eventos no qual o gatilho é criado e também sobre os eventos individuais cobertos pelo grupo de eventos. Portanto, as alterações nos eventos cobertos por grupos de eventos não se aplicam a gatilhos DDL em versões recentes do SQL Server criados nesses grupos de eventos no SQL Server 2005 (9.x).

Para obter uma lista dos grupos predefinidos de instruções DDL que estão disponíveis para gatilhos DDL, as instruções específicas que os grupos de eventos cobrem e os escopos nos quais esses grupos de eventos podem ser programados, consulte Grupos de eventos DDL.

Tarefa Artigo
Descreve como criar, modificar, excluir ou desabilitar gatilhos DDL. Implementar gatilhos DDL
Explica como criar um gatilho DDL CLR. Criar gatilhos CLR
Descreve como retornar informações sobre gatilhos de DDL. Obter informações sobre gatilhos DDL
Descreve como retornar informações sobre um evento que dispara um gatilho DDL usando a EVENTDATA função. Usar a função EVENTDATA
Descreve como gerenciar a segurança do gatilho. Gerenciar a segurança do gatilho