Imagine o seguinte cenário: uma loja de pet-shop precisa armazenar dados sobre seus produtos em um banco de dados de forma que eles são automaticamente “tirados” do estoque quando uma compra é realizada. Se não quero ir manualmente no estoque e dar baixa nos produtos, como isso será feito? Essa operação poderá ser realizada utilizando trigger, que são comandos automáticos realizados no banco de dados.
Os triggers facilitam a vida das pessoas que desejam automatizar tarefas, pois são comandos que ocorrem sempre que houver uma atualização, inserção ou remoção de um registro do banco de dados. Seu usoem banco de dados garante a possibilidade de verificar operações feitas nas tabelas (logs) e, dessa forma, garante a integridade dos dados e a segurança deles.
Na prática, pensando no exemplo do pet-shop, se for dado um comando errado utilizando os triggers, o produto comprado pode não ter sua quantidade atualizada no estoque, causando diferenças no número dos produtos. Então, vamos conferir como os triggers funcionam? Acompanhe a gente nessa jornada:
- O que são Triggers e como funcionam?
- Quando usar Triggers?
- Quais as vantagens de usar Triggers?
- Conheça as classes de Triggers no SQL: DDL e DML!
- Como usar Triggers?
- Criando um Trigger
- Alterando um Trigger
- Excluindo um Trigger
- Problemas causados por usar Trigger de forma incorreta!
- Boas práticas quando estiver usando Trigger!
O que são Triggers e como funcionam?
Trigger significa gatilho, em português.Sua principal funcionalidade é a automatização de tarefas no banco de dados após ocorrer alguma ação, como a inserção, deleção ou alteração de alguma linha. Os triggers possuem duas classes principais: a DDL e a DML. Vamos falar sobre elas a seguir.
Quando usar Triggers?
A utilização de triggers dependerá muito de como você está desenvolvendo sua aplicação. O momento ideal para usar triggers seria quando você deseja tirar algumas funções de sua aplicação e colocá-las no banco de dados. Um exemplo seria o armazenamento de acessos à sua aplicação, visto que o trigger vai disparar uma função que vai pegar os dados do visitante (IP, data de acesso, etc) e criará um log de usuário.
Quais as vantagens de usar Triggers?
As vantagens de utilização dos triggers seriam:
- Garantia de segurança e integridade dos dados;
- Processos de auditoria;
- Automatização de processos e tarefas;
- Armazenamento das operações realizadas (logs).
Ou seja, além de proporcionar a você a automatização de tarefas, também proporciona a segurança e integridade dos dados para processos de auditoria.
Conheça as classes de Triggers no SQL: DDL e DML
Triggers DDL (Data Definition Language)
Vamos aprender as classes do SQL. Em português linguagem de definição de data, essa classe está relacionada quando você realiza a alteração da estrutura de uma tabela ou com rotinas que a pessoa programadora criou para seren realizadas pelo servidor, como procedimentos de segurança que são feitos periodicamente.
Triggers DML (Data Modification Language)
Já a linguagem de modificação de dados define os eventos de gatilhos que ocorrem quando há modificação de dados, ou seja, quando você insere, deleta ou atualiza um dado — que são alguns dos principais comandos SQL.
Como usar Triggers?
A sintaxe de utilização de um trigger é a seguinte:
CREATE TRIGGER [Nome_do_Trigger]
ON [Nome_da_tabela_do_Banco_de_Dados]
AFTER/BEFORE {[Operação - Insert, update, delete]}
AS
{comandos_sql}
Fonte: GitHub
Ou seja:
- Utilize o comando CREATE TRIGGER na primeira linha acompanhado do nome do trigger — que pode ser qualquer um;
- Na segunda linha, adicione a cláusula ON acompanhada do nome da tabela do banco de dados da sua aplicação;
- Na terceira linha, devem estar os comandos AFTER/BEFORE (DEPOIS/ANTES), acompanhados da operação desejada (inserção, atualização ou remoção). Ou seja, você vai definir se uma operação de inserção vai ocorrer antes ou depois de determinada ação, por exemplo;
- Na quarta e quinta linha, são os comandos do banco de dados que você irá executar para complementar o trigger.
Vamos demonstrar na prática a criação dos triggers, a seguir.
Criando um Trigger
Para exemplificar as operações na prática, vamos usar o banco de dados MySQL para a criação de um trigger, e, na inserção, utilizaremos o comando insert.
Lembrando o exemplo do pet shop, criamos uma tabela chamada PRODUTOS_SERVICOS, conforme a imagem abaixo:
Fonte: GitHub
Como você pode ver, os dados contidos na tabela são:
- idProdutos_Servicos – do tipo inteiro;
- nome – do tipo varchar (caracteres);
- descrição – do tipo varchar (caracteres);
- valor – do tipo decimal;
- fornecedor – do tipo varchar (caracteres);
- tipo – do tipo varchar (caracteres);
- preco_desconto – do tipo decimal.
Vamos construir um trigger para que, a cada produto adicionado, será aplicado um desconto nele:
O script do trigger seria este:
CREATE TRIGGER trigger_desconto_produto BEFORE INSERT
on PRODUTOS_SERVICOS
FOR EACH ROW
SET NEW.preco_desconto = (NEW.valor * 0.90);
Fonte: GitHub
Como você pode notar, foi dado um nome a ele de trigger_desconto_produto e, pelo comando BEFORE INSERT, a operação será feita antes da inserção de um novo valor na tabela PRODUTOS_SERVICOS. O comando FOR EACH ROW significa que será aplicado para cada linha da tabela e, as orientações com o comando SET indicam a multiplicação no valor inicial, para entrar no campo preco_desconto.
Você deve estar se perguntando: por que a palavra NEW na última linha do script? Porque tanto o preço inicial (valor), quanto o preco_desconto ainda não existem, já que o gatilho vai ser disparado no comando INSERT. Porém, você não utilizará o NEW sempre e essa escolha dependerá de como o comando será utilizado.
Ok! Entendi tudo da explicação. Mas, agora, como sei se deu certo ou não, sendo que é um comando automático? Simples: será necessário inserir um dado na tabela PRODUTOS_SERVICOS e verificar a coluna preco_desconto:
O script do insert para a tabela seria este:
insert into PRODUTOS_SERVICOS values
(null, 'Ração para Peixes', 'Alimento para peixes',5.00, 'Magnus', 'Produto', 0);
Fonte: GitHub
Ao dar um select na tabela PRODUTOS_SERVICOS, o preco_desconto estará aplicado no produto que foi inserido:
Legal né? Vimos como utilizar um trigger no comando insert para aplicação de um desconto em um produto recém inserido no banco de dados. Vejamos outros casos agora, na sequência.
Alterando um Trigger
Para a alteração, será necessária a utilização do comando update. Vamos explorar um caso em que o preço foi alterado, no qual existe uma tabela que armazene o preço antigo. Para isso, foi criada uma tabela chamada HISTORICO_PRECO_PRODUTO, que é basicamente uma cópia da tabela PRODUTOS_SERVICOS, contendo os mesmos dados:
Fonte: GitHub
Com isso, o trigger criado irá inserir os dados antigos nesta tabela acima após a atualização de um preço do produto. Ou seja, será um trigger que vai misturar inserção com atualização? Sim, isso mesmo! O script será o seguinte:
create trigger historico_preco_produto before update
on PRODUTOS_SERVICOS
for each row
insert into historico_preco_produto
values(old.idProdutos_Servicos, old.nome, old.descricao, old.valor, old.fornecedor, old.tipo, old.preco_desconto);
Fonte: GitHub
Como você pode notar, foi dado um nome a ele de histórico_preco_produto e, pelo comando BEFORE UPDATE, a operação será feita antes da atualização de um valor na tabela PRODUTOS_SERVICOS. O comando FOR EACH ROW significa que será aplicado para cada linha da tabela e, as orientações com o comando INSERT INTO historico_preco_produto indicam que os valores antigos serão inseridos na tabela historico_preco_produto.
Agora você deve estar se perguntando: por que a palavra OLD na última linha do script? Porque, da mesma forma que o comando NEW foi usado para valores novos que eram inseridos, o comando OLD seria para valores antigos que ainda não existem.
Para saber se tudo deu certo, você precisa fazer um update do valor do produto na tabela PRODUTOS_SERVICOS e depois selecionar a tabela HISTORICO_PRECO_PRODUTO para que ela contenha os valores anteriores.
O script do update para a tabelaseria este:
update PRODUTOS_SERVICOS
set valor = 200.00
where idProdutos_Servicos = 1;
Fonte: GitHub
Se você é craque em comandos MySQL, ele vai atualizar o valor dos produtos para duzentos quando o id dos produtos for igual a um.
Ao executar o comando acima e dar um select em ambas as tabelas criadas, note que em uma delas terá o valor atualizado e, na outra, o valor antigo do produto:
Legal, não acha? Ou seja, esse trigger monitorará toda alteração que o valor do produto terá e armazenará os valores antigos na tabela HISTORICO_PRECO_PRODUTO. Agora, vamos ver um caso de deleção de um trigger.
Excluindo um Trigger
Para trabalharmos com a deleção de um trigger na tabela do banco de dados, precisamos utilizar o comando delete. A lógica será similar ao fizemos no update. Criamos uma nova tabela com o nome DELECAO_PRODUTOS, com os mesmos atributos da tabela PRODUTOS_SERVICOS e adição de uma coluna chamada deletedAt —que é um atributo datetime.
Fonte: GitHub
O que será feito com ela? Bom, todos os registros que forem excluídos da tabela PRODUTOS_SERVICOS vão constar nessa tabela (DELECAO_PRODUTOS) e terão a hora e o dia exato da exclusão. Assim, foi criado o seguinte trigger:
create trigger delete_produto before delete
on PRODUTOS_SERVICOS
for each row
insert into DELECAO_PRODUTOS
values(old.idProdutos_Servicos, old.nome, old.descricao, old.valor, old.fornecedor, old.tipo, old.preco_desconto, now());
Fonte: GitHub
Como você pode notar, foi dado um nome a ele de delete_produto e, pelo comando BEFORE DELETE, a operação será feita antes da exclusão de um valor na tabela PRODUTOS_SERVICOS. As orientações com o comando INSERT INTO DELECAO_PRODUTOS indica que os valores antigos serão inseridos na tabela DELECAO_PRODUTOS. O atributo OLD será utilizado pelas razões já explicadas anteriormente.
Para saber se tudo deu certo, você precisa fazer um delete do valor do produto na tabela PRODUTOS_SERVICOS e, depois, selecionar a tabela DELECAO_PRODUTOS para que ela contenha os valores anteriores.
O script do delete para a tabelaseria este:
DELETE FROM PRODUTOS_SERVICOS
WHERE idProdutos_Servicos = 1;
Fonte: GitHub
Ou seja, o comando vai deletar o valor dos produtos para quando o id dos produtos for igual a um.
Ao executar o comando acima e dar um select na tabela DELECAO_PRODUTOS note que haverá o dia e a hora em que aquele registro em específico foi deletado:
Ou seja, esse trigger monitorará toda deleção que será feita na tabela PRODUTOS_SERVICOS e armazenará os valores antigos na tabela DELECAO_PRODUTOS.
Problemas causados por usar Trigger de forma incorreta
Como vimos, para a maioria dos scripts de triggers que forem feitos, haverá um comando for each row que indica que o comando será realizado por linha. Ou seja, se for feita uma operação em um lote muito alto, por exemplo a venda de dez produtos iguais que possuam triggers amarrados a eles, podem ocorrer divergências causadas pelo trigger que dá baixa do produto vendido no estoque, por exemplo. Isso pode trazer problemas para o estabelecimento, que terá a numeração do estoque comprometida.
Boas práticas quando estiver usando Trigger
Para que a utilização de triggers em sua aplicação tenha um funcionamento eficiente, devemos seguir algumas boas práticas:
- Fazer triggers que tenham alta clareza e coerência;
- Utilizá-los somente quando for realmente necessário;
- Adotar um padrão de nomenclatura para novos triggers, assim, se outra pessoa desenvolvedora visualizar a função, conseguirá compreendê-la.
Como vimos, a automatização de tarefas, segurança e integridade de dados são extremamente importantes. Assim, a utilização de triggers é bem-vinda no banco de dados da aplicação que você está criando, desde que o gatilho não possua efeitos colaterais e seja o mais breve possível.
Além disso, é preciso utilizar triggers somente quando for necessário. Quando você reparar que estão se acumulando muitas responsabilidades em sua aplicação que podem ser divididas para o banco de dados, chegou o momento perfeito de adicionar os triggers em seu sistema!
Gostou de aprender sobre triggers? Esse é apenas um dos diversos assuntos que a linguagem SQL possui. Para continuar seu aprendizado, confira mais sobre os tipos de banco de dados existentes na tecnologia.