Compartilhar via


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 vários 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 realizar as seguintes tarefas:

  • 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 disparam um gatilho DDL criado para um evento CREATE_TYPE.

Tipos de trigger DDL

Gatilho 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 acionado se uma instrução como ALTER SERVER CONFIGURATION 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.

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 usando a EVENTDATA função.

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

Ao contrário dos gatilhos DML (Linguagem de Manipulação de Dados), os gatilhos DDL não são limitados a esquemas. Portanto, funções como OBJECT_ID, OBJECT_NAMEe OBJECTPROPERTYOBJECTPROPERTYEX 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 do gatilho.

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 disparar em resposta a um CREATE_TABLE evento pode fazer isso 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 evento CREATE_LOGIN só pode ser acionado quando o evento CREATE_LOGIN ocorre na instância do servidor.

No exemplo a seguir, o gatilho safety DDL é acionado sempre que um DROP_TABLE ou ALTER_TABLE evento ocorre 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;

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

Os gatilhos DDL com o escopo de banco de dados são armazenados como objetos no banco de dados no qual são criados. Os gatilhos DDL podem ser criados no master banco de dados e se comportar exatamente como aqueles criados em bancos de dados projetados pelo usuário. Você pode obter as informações sobre os gatilhos DDL. Basta consultar o modo de exibição do 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 DDL com o escopo de servidor são armazenados como objetos no banco de dados master. Contudo, você pode obter as informações sobre os gatilhos DDL com escopo de servidor. Basta consultar o catálogo sys.server_triggers 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 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.

Selecione um conjunto 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 você quiser que um gatilho DDL seja acionado depois que qualquer instrução CREATE TABLE, ALTER TABLE ou DROP TABLE for executada, você poderá especificar FOR DDL_TABLE_EVENTS na instrução CREATE TRIGGER. Após a execução de CREATE TRIGGER, os eventos cobertos por um grupo de eventos são adicionados à visualização do 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 inclui informações sobre o grupo de eventos, sys.trigger_events inclui informações apenas sobre os eventos individuais cobertos por esse grupo. sys.trigger_events persiste os metadados sobre o grupo de eventos no qual o gatilho é criado e também sobre os eventos individuais que o grupo de eventos aborda. 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 criadas 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 Artigo
Descreve como criar, modificar, excluir ou desabilitar gatilhos DDL. Implementar os gatilhos DDL
Descreve como criar um gatilho DDL CLR. Criar os gatilhos CLR
Descreve como retornar informações sobre gatilhos DDL. Obter informações sobre os 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