Compartilhar via


Gatilhos DML

Os gatilhos DML são um tipo especial de procedimento armazenado que entra em vigor automaticamente quando ocorre um evento DML (linguagem de manipulação de dados) que afeta a tabela ou a exibição definida no gatilho. Os eventos DML incluem 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 única transação, que pode ser revertida de dentro do gatilho. Se um erro grave for detectado (por exemplo, espaço em disco insuficiente), toda a transação será revertida automaticamente.

Benefícios do gatilho DML

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

A lista a seguir compara gatilhos DML com restrições e identifica quando os gatilhos DML têm benefícios.

  • Os gatilhos DML podem fazer alterações em cascata por meio de tabelas relacionadas no banco de dados; no entanto, essas alterações podem ser executadas com mais eficiência usando restrições de integridade referencial em cascata. Restrições FOREIGN KEY podem validar um valor de coluna apenas com uma correspondência exata para um valor em outra coluna, a menos que a cláusula REFERENCES defina uma ação referencial em cascata.

  • Eles podem se proteger contra operações INSERT, UPDATE e DELETE mal-intencionadas ou incorretas e impor outras restrições mais complexas do que aquelas definidas com restrições CHECK.

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

  • Eles podem avaliar o estado de uma tabela antes e depois de uma modificação de dados e executar ações com base nessa diferença.

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

  • As restrições só podem transmitir erros por meio de mensagens padronizadas de erro do sistema. Se o aplicativo exigir ou se beneficiar de mensagens personalizadas e tratamento de erros mais complexos, você deverá usar um gatilho.

  • Os gatilhos DML podem não permitir ou reverter alterações que violam a integridade referencial, cancelando assim a tentativa de modificação de dados. Esse gatilho pode entrar em vigor quando você altera uma chave estrangeira e o novo valor não corresponde à chave primária. No entanto, restrições FOREIGN KEY geralmente são usadas para essa finalidade.

  • Se houver restrições na tabela de gatilho, 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 de gatilho INSTEAD OF serão revertidas e o gatilho AFTER não será executado.

Tipos de gatilhos de DML

Gatilho Após
Os gatilhos AFTER são executados após a ação da instrução INSERT, UPDATE, MERGE ou DELETE ser executada. Os gatilhos AFTER nunca serão executados se ocorrer uma violação de restrição; portanto, esses gatilhos não podem ser usados para qualquer processamento que possa impedir 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 EM VEZ DE
Em vez disso, os gatilhos OF substituem as ações padrão da instrução de gatilho. Portanto, eles podem ser usados para executar verificação de erro ou valor em uma ou mais colunas e executar ações adicionais antes de inserir, atualizar ou excluir linhas ou linhas. Por exemplo, quando o valor que está sendo atualizado em uma coluna de salário por hora em uma tabela de folha de pagamento excede um valor especificado, um gatilho pode 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 permitem exibições que não seriam atualizáveis para dar suporte a atualizações. Por exemplo, uma exibição baseada em várias tabelas base deve usar um gatilho INSTEAD OF para dar 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 permitem que você codifique a lógica que pode rejeitar partes de um lote, permitindo que outras partes de um lote tenham êxito.

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

Função Gatilho POSTERIOR INSTEAD OF Gatilho
Aplicabilidade Tabelas Tabelas e visões
Quantidade por tabela ou exibição Várias por ação de gatilho (UPDATE, DELETE e INSERT) Uma por ação de disparo ("UPDATE", "DELETE" e "INSERT")
Referências em cascata Nenhuma restrição se aplica Gatilhos INSTEAD OF UPDATE e DELETE não são permitidos em tabelas que são alvos de restrições de integridade referencial em cascata.
Execução Depois:

Processamento de restrições
Ações referenciais declarativas
criação de tabelas inseridas e excluídas
A ação desencadeante
Antes: Processamento de restrições

No lugar de: A ação de gatilho

Depois: criação de tabelas inseridas e excluídas
Ordem de execução A primeira e a última execução podem ser especificadas Não aplicável
varchar(max), nvarchar(max)e varbinary(max) referências de coluna em tabelas inseridas e excluídas Permitido Permitido
text, ntexte image referências de coluna 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 escritos em código gerenciado que são membros de um assembly criado no .NET Framework e carregados no SQL Server.

Tarefa Tópico
Descreve como criar um gatilho DML. Criar desencadeadores DML
Descreve como criar um gatilho CLR. Criar gatilhos CLR
Descreve como criar um gatilho DML para lidar com modificações de dados de linha única e de várias linhas. Criar gatilhos DML para lidar com várias linhas de dados
Descreve como aninhar gatilhos. Criar gatilhos aninhados
Descreve como especificar a ordem na qual os gatilhos AFTER são disparados. Especificar primeiro e último gatilhos
Descreve como usar as tabelas especiais inseridas e excluídas no código do 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 do gatilho

Consulte Também

CREATE TRIGGER (Transact-SQL)
ALTER TRIGGER (Transact-SQL)
DROP TRIGGER (Transact-SQL)
DESABILITAR GATILHO (Transact-SQL)
Funções de gatilho (Transact-SQL)