Aprenda SQL: disparadores de SQL

Aprenda SQL: disparadores de SQL

SQL Triggers - the data model we'll use in the article
cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br


Os gatilhos SQL são outro objeto de banco de dados poderoso que temos à nossa disposição. Nos artigos anteriores, abordamos funções definidas pelo usuário, procedimentos definidos pelo usuário e exibições SQL. Hoje falaremos sobre gatilhos SQL e como
    usá-los para alcançar o comportamento desejado.

O Modelo

Antes de passarmos para o tópico deste artigo, vamos dar uma olhada rápida no modelo que estamos usando neste artigo, mas também ao longo desta série.

Disparadores SQL - o modelo de dados que usaremos no artigo

Neste artigo, focaremos nos acionadores DML (linguagem de manipulação de dados) e mostraremos como eles funcionam quando fazemos
    alterações em uma única tabela.

O que são gatilhos SQL?

No SQL Server, gatilhos são objetos de banco de dados, na verdade, um tipo especial de procedimento armazenado, que “reage” a determinadas ações que fazemos no banco de dados. A principal idéia por trás dos gatilhos é que eles sempre executam uma ação no caso de algum evento acontecer. Se estivermos falando sobre gatilhos DML, essas alterações serão alterações em nossos dados. Vamos examinar algumas situações interessantes:

  • Caso você faça uma inserção no ligar tabela, você deseja atualizar o cliente relacionado que possui 1
            mais chamada (nesse caso, deveríamos ter atributo inteiro no cliente mesa)

  • Quando você completa uma ligar (atualizar o valor do atributo call.end_time) você deseja aumentar o
            contador de chamadas realizadas por esse funcionário durante esse dia (novamente, devemos ter esse atributo no
    empregado mesa)

  • Quando você tenta excluir um empregado, você deseja verificar se há chamadas relacionadas. Se sim, você
            impedir que excluir e gerar uma exceção personalizada

A partir de exemplos, você pode observar que os gatilhos DML são ações relacionadas aos comandos SQL definidos nesses gatilhos.
    Como eles são semelhantes aos procedimentos armazenados, você pode testar valores usando a instrução SE, etc. Isso fornece muita flexibilidade.

O bom motivo para usar os acionadores DML SQL é o caso em que você deseja garantir que um determinado controle seja executado antes ou depois da instrução definida na tabela definida. Esse pode ser o caso quando seu código estiver em todo o lugar, por exemplo, O banco de dados é usado por diferentes aplicativos, o código é escrito diretamente nos aplicativos e você não o está bem documentado.

Tipos de gatilhos SQL

No SQL Server, temos 3 grupos de gatilhos:

  • Acionadores de DML (linguagem de manipulação de dados) – já os mencionamos e eles reagem aos comandos do DML. Estes
            are – INSERT, UPDATE e DELETE

  • Gatilhos DDL (linguagem de definição de dados) – Como esperado, gatilhos desse tipo devem reagir a comandos DDL como –
            CREATE, ALTER e DROP

  • Gatilhos de logon – o nome já diz tudo. Esse tipo reage aos eventos LOGON

Neste artigo, focaremos nos gatilhos DML, porque eles são mais comumente usados. Nós vamos cobrir os dois restantes
    tipos de gatilhos nos próximos artigos desta série.

Gatilhos DML – Sintaxe

A sintaxe SQL simplificada para definir o acionador é a seguinte.

A maior parte da sintaxe deve ser auto-explicativa. A idéia principal é definir:

  • Um conjunto de {sql_statements} que deve ser realizada quando o gatilho é disparado (definido pelos parâmetros restantes)

  • Nós devemos definir quando o gatilho é disparado. É isso que a parte {FOR | DEPOIS | AO INVÉS DE} faz. Se nosso gatilho
            é definido como FOR | DEPOIS | AO INVÉS DE As instruções SQL do gatilho do SQL devem ser executadas após todas as ações
            que disparou esse gatilho é iniciado com sucesso. o AO INVÉS DE gatilho deve executar controles e substituir o
            ação original com a ação no gatilho, enquanto o FOR | DEPOIS DE (eles significam o mesmo) gatilho deve ser executado
            comandos adicionais após a conclusão da instrução original

  • A parte {[INSERT] [,] [UPDATE] [,] [DELETE]} indica qual comando realmente dispara esse gatilho. Nós devemos especificar
            pelo menos uma opção, mas poderíamos usar várias se necessário

Com isso em mente, podemos escrever facilmente gatilhos que irão:

  • Verifique (antes da inserção) se todos os parâmetros da instrução INSERT estão OK, adicione alguns, se necessário, e execute o
            inserir

  • Após a inserção, execute tarefas adicionais, como atualizar um valor em outra tabela

  • Antes de excluir, verifique se há registros relacionados

  • Atualize certos valores (por exemplo, arquivo de log) após a exclusão ser concluída

Se você quiser soltar um gatilho, use:

Gatilho SQL INSERT – Exemplo

Primeiro, criaremos um gatilho SQL simples que deve executar a verificação antes da instrução INSERT.

Podemos ver nosso gatilho no Pesquisador de Objetos, quando expandimos os dados para a tabela relacionada
    (país)

exploração e gatilhos de objetos

Quero enfatizar algumas coisas aqui:

  • A instrução INSERT aciona essa consulta e é realmente substituída (INSTEAD OF INSERT) pela instrução neste
            desencadear

  • Definimos várias variáveis ​​locais para armazenar valores do registro de inserção original (INSERTED). este
            registro é específico para gatilhos e permite acessar esse registro único e seus valores

  • Nota: O registro INSERTED pode ser usado nos disparos SQL de inserção e atualização.
  • Com as instruções IF, testamos valores e valores SET se eles não foram definidos antes

  • No final da consulta, executamos a instrução INSERT (a que substitui a original que disparou esse
            desencadear)

Vamos agora executar um comando INSERT INTO e ver o que acontece no banco de dados. Executaremos as seguintes instruções:

O resultado está na imagem abaixo.

o resultado da instrução insert

Você pode perceber facilmente que a linha com id = 10 foi inserida. Não especificamos o country_name, mas o gatilho fez o seu trabalho e preencheu esse valor com country_name_eng.

  • Nota: Se o gatilho for definido em uma determinada tabela, para uma determinada ação, ele sempre será executado quando essa ação for executada.

Gatilho SQL DELETE – Exemplo

Agora, vamos criar um gatilho que dispara sobre a instrução DELETE no país mesa.

Para esse gatilho, vale ressaltar o seguinte:

  • Mais uma vez, executamos a ação antes (em vez de) da execução real (INSTEAD OF DELETE)

  • Usamos o registro DELETED. Este registro pode ser usado nos gatilhos relacionados à instrução DELETE

  • Nota: O registro DELETED pode ser usado para excluir e atualizar gatilhos SQL.
  • Usamos a instrução SE para determinar se a linha deve ou não ser excluída. Se deveria, nós temos
            executamos a instrução DELETE e, se não, somos lançados e exceção

A execução da instrução abaixo foi sem erro porque o país com o ID = 6 não tinha registros relacionados.

Se executarmos esta declaração, veremos uma mensagem de erro personalizada, conforme mostrado na figura abaixo.

a mensagem de erro lançada pelo gatilho SQL

Essa mensagem não é apenas descritiva, mas nos permite tratar bem esse erro e mostrar uma mensagem mais significativa
    para o usuário final.

Gatilho UPDATE do SQL

Vou deixar este para você, como prática. Portanto, tente anotar o gatilho UPDATE. O importante que você deve
    O que sabemos é que, no gatilho de atualização, você pode usar os registros – INSERTED (após a atualização) e DELETED (antes da atualização).
    Em quase todos os casos, você precisará usar os dois.

Quando usar gatilhos SQL?

Os gatilhos compartilham muito em comum com os procedimentos armazenados. Ainda assim, comparado aos procedimentos armazenados, eles são limitados no que você pode fazer. Portanto, prefiro ter um procedimento armazenado para inserir / atualizar / excluir e fazer todas as verificações e ações adicionais lá.

Ainda assim, essa nem sempre é a opção. Se você herdou um sistema ou simplesmente não deseja colocar toda a lógica nos procedimentos armazenados, os gatilhos podem ser uma solução para muitos problemas que você possa ter.

Índice

Emil Drkusic
Últimas mensagens de Emil Drkusic (ver todos)

Leia Também  [Video] Mês de treinamento gratuito do DBA: configurando o TempDB, bloquear páginas na memória e o DAC