Fala galera, nesse novo post vou tratar de um assunto que para quem não conhece pode parecer difícil (mas não é =] )
e para os que já conhecem algumas dicas que fazem a diferença!
Primeiramente é necessário entender que a trigger(gatilho) é disparada através de uma ação. Ela pode ser a nível de Instância(servidor, como de logon, por exemplo), a nível de banco de dados(comandos CREATE, ALTER, entre outros) e também a nível de tabela que é o que focaremos nesse post (ao ocorrer um INSERT, DELETE, ou então antes de realizar um UPDATE, por exemplo).
Dentro desse objeto é possível manipular informação, validar algo, gerar logs e até mesmo bloquear alguma ação. Algumas funções locais podem ser utilizadas em uma trigger, dentre elas HOST_NAME(), APP_NAME(), GETDATE(), que nos retornam respectivamente o nome da máquina que esta executando a ação, o nome da aplicação e a data de execução.
Posso também utilizar uma procedure, ou seja, chamar a execução de uma proc passando determinados parâmetros em uma trigger. Por exemplo, ao inserir um novo cliente na tabela de clientes, a trigger chama uma procedure que gera um novo cadastro em outra tabela passando como parâmetro o nome do cliente e o CPF.
A trigger pode ser disparada antes da ação acontecer de fato ou depois dela ocorrer. Explico: Antes de uma informação ser inserida em uma tabela uma trigger pode validar dados antes de confirmar o INSERT, ou após atualizar uma informação em uma tabela gerar uma mensagem de aviso para um usuário.
Para entender o conceito desse objeto é necessário antes compreender como trabalhamos dentro dele. No ambiente de uma trigger existem duas tabelas muito importantes: Deleted - que armazena as informações que estão saindo da tabela (em tempo de execução) - e a Inserted - que armazena as informações que estão entrando na tabela (também em tempo de execução). Ao executar um INSERT em uma tabela apenas minha tabela INSERTED será preenchida, pois não tenho dados "saindo". Se executar um update, as duas serão preenchidas, pois teremos o valor que esta saindo na DELETED e os valores que estão entrando na INSERTED (campo situação estava Cadastrado e passou para Baixado por exemplo, o "Cadastrado" estará na DELETED e o "Baixado" na INSERTED). Em caso de um DELETE em uma tabela apenas a tabela DELETED será preenchida, pois não tenho dados "entrando".
Sintaxe de criação de uma trigger em uma tabela
CREATE TRIGGER [NOME_TRIGGER]
ON [NOME DA TABELA]
[FOR/AFTER/INSTEAD OF] [INSERT/UPDATE/DELETE]
AS
BEGIN
-- REGRA
END
Nome da trigger: Boa prática é utilizar um padrão de nomenclatura (Exemplo: T_NOMETABELA_UPDATE)
Nome da tabela: Em qual tabela a trigger ficará alocada
Ação desejada: FOR/AFTER/INSTEAD OF
Tipo: Ao ser executado um INSERT, UPDATE ou DELETE
Vamos para a pratica
Criando a tabela pedidos
Trigger de Insert
Ao inserir duas linhas na tabela de pedidos vemos a ação da trigger
O pedido de código 1 teve sua data alterada pois é de 2018.
Trigger de Update
Na alteração do valor a trigger exibiu uma mensagem não permitindo que o processo fosse concluído
Trigger de Delete
Ao tentar deletar o pedido a trigger não permite de acordo com a regra estabelecida.
Boas práticas:
- Utilize o mínimo possível de variáveis
- O uso de IF EXISTIS tem performance melhor do que IF com variáveis
- Melhor performance com poucas regras (trigger não é um sistema!)
- Evite recursividade (Trigger disparada em update na própria tabela, por exemplo)
- Não utilize loops
- Atenção com transações ao utilizar rollback
- Retornos de RAISERROR devem ser tratados na aplicação para serem exibidos aos usuários
- Refinar ao máximo a regra para tornar o processamento mais simples e rápido
Como podemos ver existem muitas maneiras para se usar uma trigger, é um recurso que se bem aproveitado pode ajudar muito em muitas situações do dia a dia. Gostou desse post, tem alguma dúvida ou sugestão? Deixe um comentário logo abaixo.
Até a próxima!
Comments