Compartilhar via


Gatilhos DML

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do AzureBanco de dados SQL no Microsoft Fabric

O gatilho DML é 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 INSERT, UPDATE, ou DELETE instruções. 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

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 deve sempre 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 CHECK de restrições e a RI (integridade referencial) deve ser imposta por meio FOREIGN KEY de restrições. Os gatilhos DML são mais úteis quando os recursos fornecidos por restrições não conseguem atender às necessidades funcionais do aplicativo.

A lista a seguir compara os gatilhos DML com as restrições e identifica quando esses gatilhos têm vantagens sobre as restrições.

  • 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. FOREIGN KEY as restrições podem validar um valor de coluna apenas se for exatamente igual a 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 mal-intencionadas ou incorretas INSERT, UPDATE, e DELETE e impor outras restrições mais complexas do que as definidas com as restrições CHECK.

    Ao contrário das CHECK restrições, 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 outras ações, 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 (INSERTou UPDATEDELETE) em uma tabela permitem que várias 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.

  • Os gatilhos DML podem não permitir ou reverter alterações que violam a integridade referencial, cancelando 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, FOREIGN KEY as restrições geralmente são usadas para essa finalidade.

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

Tipos de triggers DML

Gatilho AFTER

Os gatilhos AFTER são executados após a ação das instruções INSERT, UPDATE, MERGE ou DELETE ser realizada. AFTER os gatilhos 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 INSERT, UPDATEou DELETE ação especificada em uma MERGE instrução, 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 verificação de erro ou valor em uma ou mais colunas e executar outras ações antes de inserir, atualizar ou excluir linhas ou 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 INSTEAD OF gatilhos é 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 INSTEAD OF gatilho para dar suporte a inserções, atualizações e exclusões que referenciam dados em mais de uma tabela. Outra vantagem dos INSTEAD OF gatilhos é 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 AFTER Gatilho INSTEAD OF
Aplicabilidade Tabelas Tabelas e exibições
Quantidade por tabela ou exibição Múltiplas por ação de gatilho (UPDATE, DELETE e INSERT) Uma por ação de gatilho (UPDATEe DELETEINSERT)
Referências em cascata Nenhuma restrição se aplica Os gatilhos INSTEAD OF UPDATE e DELETE não são aceitos nas tabelas que são destinos de restrições de integridade referencial em cascata.
Execução Depois:

Processamento da restrição

Ações referenciais declarativas

inserted e deleted criação de tabelas

A ação de gatilho
Antes: processamento da restrição

Em vez de: a ação de gatilho

Após a criação das tabelas inserted e deleted
Ordem de execução A primeira e a última execução podem ser especificadas Não aplicável
referências de coluna varchar(max), nvarchar(max) e varbinary(max) nas tabelas inserted e deleted Permitido Permitido
As referências de coluna text, ntext e image nas tabelas inserted e deleted Não permitido Permitido

Gatilho CLR

Um gatilho CLR (Common Language Runtime) pode ser um gatilho AFTER ou INSTEAD OF. Um gatilho CLR também pode ser um gatilho DDL (Linguagem de Definição de Dados). 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 carregado no SQL Server.

Tarefa Artigo
Descreve como criar um gatilho DML. Criar os gatilhos DML
Descreve como criar um gatilho CLR. Criar os gatilhos CLR
Descreve como criar um gatilho DML para tratar modificações de dados de linha única e de várias linhas. Criar os gatilhos DML para lidar com múltiplas linhas de dados
Descreve como aninhar gatilhos. Criar os gatilhos aninhados
Descreve como especificar a ordem na qual AFTER os gatilhos 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 os gatilhos DML
Descreve como exibir informações sobre gatilhos DML. Obter informações sobre os gatilhos DML
Descreve como excluir ou desabilitar gatilhos DML. Excluir ou desabilitar os gatilhos DML
Descreve como gerenciar a segurança do gatilho. Gerenciar a segurança do gatilho