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.
Prós e Contras dos Triggers
Os principais pontos positivos sobre os triggers são:
Já contra sua utilização existem as seguintes considerações:
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:
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!!