Gatilhos DML

Os gatilhos DML são um tipo especial de procedimento armazenado que entra em vigor automaticamente quando um evento DML (linguagem de manipulação de dados) ocorre e afeta a tabela ou exibição definida no gatilho. Os eventos DML são instruções INSERT, UPDATE ou DELETE. Os gatilhos DML podem ser usados para impor regras de negócios e integridade de dados, consultar outras tabelas e incluir instruções Transact-SQL complexas. O gatilho e a instrução que o dispara são tratados como uma transação simples, que pode ser revertida dentro do gatilho. Se um erro grave for detectado (espaço em disco insuficiente, por exemplo), toda a transação será revertida automaticamente.

Benefícios do gatilho DML

Os gatilhos DML são semelhantes a restrições, pois podem impor integridade de entidade ou integridade de domínio. Em geral, a integridade da entidade sempre deve ser imposta no menor nível por índices que fazem parte das restrições PRIMARY KEY e UNIQUE ou que são criados independentemente de restrições. A integridade de domínio deve ser imposta por restrições CHECK e a RIN (integridade referencial) deve ser imposta por restrições FOREIGN KEY. Os gatilhos DML são muito úteis quando os recursos suportados por restrições não atendem às necessidades funcionais do aplicativo.

A lista a seguir compara gatilhos DML com restrições e identifica quando os gatilhos DML mais benefícios que ela.

  • Os gatilhos DML podem colocar as alterações em cascata através das tabelas relacionadas no banco de dados; no entanto, essas alterações podem ser executadas com mais eficiência utilizando restrições de integridade referencial em cascata. As restrições FOREIGN KEY só podem validar um valor de coluna com uma combinação exata de valor em outra coluna a menos que a cláusula REFERENCES defina uma ação referencial em cascata.

  • Podem proteger contra operações mal-intencionadas ou incorretas do tipo INSERT, UPDATE, e DELETE, e fazer cumprir as outras restrições mais complexas do que aquelas definidas nas restrições CHECK.

    Diferentemente das restrições CHECK, os gatilhos DML podem fazer referência a colunas em outras tabelas. Por exemplo, um gatilho pode usar um SELECT de outra tabela para comparar com os dados atualizados ou inseridos e para efetuar ações adicionais, como modificar os dados ou exibir uma mensagem de erro definida pelo usuário.

  • Podem avaliar o estado de uma tabela antes e depois da modificação dos dados e efetuar ações com base nessa diferença.

  • Vários gatilhos DML do mesmo tipo (INSERT, UPDATE, ou DELETE), em uma tabela, permitem que múltiplas ações diferentes ocorram em resposta à mesma instrução de modificação.

  • Restrições só podem comunicar erros através de mensagens de erro padronizadas do sistema. Se o aplicativo exigir ou beneficiar-se de mensagens personalizadas e tratamento de erros mais complexo, é necessário usar um gatilho.

  • Gatilhos DML podem desabilitar ou reverter alterações que violam a integridade referencial, cancelando assim a tentativa de modificação de dados. Pode ser que tais gatilhos só tenham efeito ao alterar uma chave estrangeira e se o novo valor não combinar com sua chave primária. Porém, as restrições FOREIGN KEY normalmente são usadas com este propósito.

  • Se houver restrições na tabela de gatilhos, elas serão verificadas após a execução do gatilho INSTEAD OF, mas antes da execução do gatilho AFTER. Se as restrições forem violadas, as ações do gatilho INSTEAD OF serão revertidas e o gatilho AFTER não será executado.

Tipos de gatilhos DML

  • Gatilho AFTER
    Os gatilhos AFTER são executados depois que a ação das instruções INSERT, UPDATE, MERGE ou DELETE é executada. Os gatilhos AFTER jamais são executados em caso de uma violação de restrição; por isso, estes gatilhos não podem ser usados em processamentos que possam evitar as violações de restrição. Para cada ação INSERT, UPDATE ou DELETE especificada em uma instrução MERGE, o gatilho correspondente é disparado para cada operação DML.

  • Gatilho INSTEAD OF
    Os gatilhos INSTEAD OF substituem as ações padrão da instrução de gatilho. Portanto, eles podem ser usados para executar uma verificação de erro ou valor em uma ou mais colunas, e executar ações adicionais antes de inserir, atualizar ou excluir uma ou mais linhas. Por exemplo, quando o valor que estiver sendo atualizado em uma coluna de salário calculado por hora, de uma tabela de folha de pagamento, exceder um valor especificado, um gatilho poderá ser definido para produzir uma mensagem de erro e reverter a transação, ou inserir um novo registro em uma trilha de auditoria, antes de inserir o registro na tabela de folha de pagamento. A principal vantagem dos gatilhos INSTEAD OF é que eles habilitam exibições que não seriam atualizáveis para oferecer suporte a atualizações. Por exemplo, uma exibição baseada em várias tabelas base deve usar um gatilho INSTEAD OF para oferecer suporte a inserções, atualizações e exclusões que referenciam dados em mais de uma tabela. Outra vantagem dos gatilhos INSTEAD OF é que eles o habilitam a codificar lógica que pode rejeitar partes de um lote e, ao mesmo tempo, permitir que outras partes do lote tenham êxito.

    Esta tabela compara a funcionalidade dos gatilhos AFTER e INSTEAD OF.

    Função

    Gatilho AFTER

    Gatilho INSTEAD OF

    Aplicabilidade

    Tabelas

    Tabelas e exibições

    Quantidade por tabela ou exibição

    Múltiplas ações por ação de gatilho (UPDATE, DELETE e INSERT)

    Uma ação por ação de gatilho (UPDATE, DELETE e INSERT)

    Referências em cascata

    Nenhuma restrição se aplica

    Os gatilhos INSTEAD OF UPDATE e DELETE não são permitidos em tabelas que são destinos de restrições de integridade referencial em cascata.

    Execução

    Após:

    • Processamento da restrição

    • Ações referenciais declarativas

    • Criação de tabelas inserida e excluída

    • A ação de gatilho

    Antes:

    • Processamento da restrição

    Em lugar de:

    • A ação de gatilho

    Após:

    • Criação de tabelas inserida e excluída

    Ordem de execução

    A primeira e a última execução podem ser especificadas

    Não aplicável

    As referências de coluna varchar(max), nvarchar(max) e varbinary(max) em tabelas inseridas e excluídas

    Permitido

    Permitido

    Referências de coluna text, ntext e image em tabelas inseridas e excluídas

    Não permitido

    Permitido

  • Gatilhos CLR
    Um gatilho CLR pode ser um gatilho AFTER ou INSTEAD OF. Um gatilho CLR também pode ser um gatilho DDL. Em vez de executar um procedimento armazenado Transact-SQL, um gatilho CLR executa um ou mais métodos gravados em código gerenciado que são membros de um assembly criado no .NET Framework e carregado para o SQL Server.

Tarefas relacionadas

Tarefa

Tópico

Descreve como criar um gatilho DML.

Criar gatilhos DML

Descreve como criar um gatilho CLR.

Criar gatilhos CLR

Descreve como criar um gatilho DML para tratar modificações de dados de linha única e de várias linhas.

Crie gatilhos DML para tratar várias linhas de dados

Descreve como aninhar gatilhos.

Criar gatilhos aninhados

Descreve como especificar a ordem na qual são os gatilhos AFTER são disparados.

Especificar o primeiro e o último gatilhos

Descreve como usar as tabelas especiais inseridas e excluídas no código de gatilho.

Usar as tabelas inseridas e excluídas

Descreve como modificar ou renomear um gatilho DML.

Modificar ou renomear gatilhos DML

Descreve como exibir informações sobre gatilhos DML.

Obter informações sobre gatilhos DML

Descreve como excluir ou desabilitar gatilhos DML.

Excluir ou desabilitar gatilhos DML

Descreve como gerenciar a segurança do gatilho.

Gerenciar a segurança dos gatilhos

Consulte também

Referência

CREATE TRIGGER (Transact-SQL)

ALTER TRIGGER (Transact-SQL)

DROP TRIGGER (Transact-SQL)

DISABLE TRIGGER (Transact-SQL)

Conceitos

Funções de gatilho (Transact-SQL)