TRIGGERS

 

Trigger é um recurso de programação executado sempre que o evento associado ocorrer. Trigger é um tipo especial de procedimento armazenado, que é executado sempre que há uma tentativa de modificar os dados de uma tabela que é protegida por ele. É muito utilizado para ajudar a manter a consistência dos dados ou para propagar alterações em um determinado dado de uma tabela para outras. Um bom exemplo é um gatilho criado para controle de quem alterou a tabela, nesse caso, quando a alteração for efetuada, o trigger é "disparado" e grava em uma tabela de histórico de alteração, o usuário e data/hora da alteração.

 
Imagem demonstrativa de Trigger
 

Prós e Contras dos Triggers

 

Os principais pontos positivos sobre os triggers são:

 
  • Parte do processamento que seria executado na aplicação passa para o banco, poupando recursos da máquina cliente.
  • Facilita a manutenção, sem que seja necessário alterar o código fonte da aplicação.
  •  

Já contra sua utilização existem as seguintes considerações:

 
  • Alguém que tenha acesso não autorizado ao banco de dados poderá visualizar e alterar o processamento realizado pelos gatilhos.
  • Requer maior conhecimento de manipulação do banco de dados (SQL) para realizar as operações internamente.
  •  

A seguir é explicado o processo de criação de triggers, a sintaxe utilizada e o significado de cada instrução.

 

A sintaxe dos comandos para criar um novo trigger no MySQL é a seguinte:

CREATE TRIGGER nome momento evento
ON tabela
FOR EACH ROW
BEGIN
/*corpo do código*/
END
 

Onde se tem os seguintes parâmetros:

  • nome: nome do trigger, segue as mesmas regras de nomeação dos demais objetos do banco.
  • momento: quando o trigger será executado. Os valores válidos são BEFORE (antes) e AFTER (depois).
  • evento: evento que vai disparar o trigger. Os valores possíveis são INSERT, UPDATE e DELETE. Vale salientar que os comandos LOAD DATA e REPLACE também disparam os eventos de inserção e exclusão de registros, com isso, os gatilhos também são executados.
  • tabela: nome da tabela a qual o gatilho está associado.
  •  

Não é possível criar mais de um trigger para o mesmo evento e momento de execução na mesma tabela. Por exemplo, não se pode criar dois triggers AFTER INSERT na mesma tabela.

 

Os registros NEW e OLD

 

Como os triggers, são executados em conjunto com operações de inclusão e exclusão, é necessário poder acessar os registros que estão sendo incluídos ou removidos. Isso pode ser feito através das palavras NEW e OLD. Em triggers executados após a inserção de registros, a palavra reservada NEW dá acesso ao novo registro. Pode-se acessar as colunas da tabela como atributo do registro NEW, como veremos nos exemplos.

O operador OLD funciona de forma semelhante, porém em triggers que são executados com a exclusão de dados, o OLD dá acesso ao registro que está sendo removido.

 

Utilização do trigger

 

Para exemplificar e tornar mais clara a utilização de triggers, é simulada a seguinte situação: um mercado que, ao realizar vendas, precisa que o estoque dos produtos seja automaticamente reduzido. A devolução do estoque deve também ser automática no caso de remoção de produtos da venda.

Como se trata de um ambiente hipotético, teremos apenas duas tabelas de estrutura simples, cujo script de criação é mostrado na listagem a seguir.

 
CREATE TABLE produtos (
    referencia  VARCHAR(3) PRIMARY KEY,
    descricao   VARCHAR(50) UNIQUE,
    estoque INT NOT NULL
);
 
INSERT INTO Produtos VALUES ('1', 'Lasanha', 10);
INSERT INTO Produtos VALUES ('2', 'Morgango', 5);
INSERT INTO Produtos VALUES ('3', 'Farinha', 15);
 
CREATE TABLE itensvenda (  
    venda INT,
    produto VARCHAR(3),
    quantidade  INT
);
 

Ao inserir e remover registro da tabela itensvenda, o estoque do produto referenciado deve ser alterado na tabela produtos. Para isso, serão criados dois triggers: um AFTER INSERT para dar baixa no estoque e um AFTER DELETE para fazer a devolução da quantidade do produto.

 
DELIMITER;;
 
CREATE TRIGGER tgr_itensvenda_insert AFTER INSERT
ON itensvenda
FOR EACH ROW
BEGIN
    UPDATE produtos SET estoque = Estoque - NEW.quantidade
WHERE referencia = NEW.produto;
END;
 
CREATE TRIGGER tgr_itensvenda_delete AFTER DELETE
ON itensvenda
FOR EACH ROW
BEGIN
    UPDATE produtos SET estoque = estoque + OLD.quantidade
WHERE referencia = OLD.produto;
END;
 
DELIMITER;
 

No primeiro trigger, foi utilizado o registro NEW para obter as informações da linha que está sendo inserida na tabela. O mesmo é feito no segundo trigger, onde se obtém os dados que estão sendo apagados da tabela através do registro OLD. Tendo criado os triggers, pode-se testá-los inserindo dados na tabela itensvenda. Nesse caso, é simulada uma venda de número 1 que contém três unidades do produto 1, uma unidade do produto 2 e cinco unidades do produto 3.

 

Insere dados na tabela.

 
INSERT INTO itensvenda VALUES (1, '1',3);
INSERT INTO itensvenda VALUES (1, '2',1);
INSERT INTO itensvenda VALUES (1, '3',5);
 

Nota-se que o estoque dos produtos foi corretamente reduzido, de acordo com as quantidades "vendidas". Agora para testar o trigger da exclusão, será removido o produto 1 dos itens vendidos. Com isso, o seu estoque deve ser alterado para o valor inicial, ou seja, 10.

 
DELETE FROM itensvenda WHERE venda = 1 AND produto = '1';
 

Em ambientes reais, triggers podem ser utilizados para operações mais complexas, por exemplo, antes de vender um item, verificar se há estoque disponível e só então permitir a saída do produto.

  

Atividade de Fixação

 

No intuito de fixar a aprendizagem iniciada por meio deste módulo e verificar como está sua compreensão sobre o mesmo, são sugeridos alguns exercícios de fixação para serem resolvidos. Clique no link de exercícios ao lado, pois será por meio dele iniciada a lista de exercícios sobre os conteúdos estudados até este momento. Boa revisão sobre os mesmos!!