You are on page 1of 13

Administrao e Projeto de Banco de dados

Aula 15 Triggers Prof Mauricio M. Faria UNIBAN


Administrao e Projeto de Banco de Dados - Uniban Brasil - profmauriciofaria@gmail.com 1

Definio de Triggers

Uma Trigger (gatilho) possui muitas semelhanas com uma Stored Procedure. A diferena reside em sua execuo, que acontece diante de um evento iniciado por comandos Insert, Delete ou Update (comandos DML).
Muitas vezes as restries criadas no BD no so suficientes para manter a integridade dos dados. Talvez esta seja uma das principais utilidades da Trigger, porm ela pode ser usada para os mais diversos fins. Um exemplo seria o desenvolvimento de um mtodo prprio de auditoria.
Administrao e Projeto de Banco de Dados - Uniban Brasil - profmauriciofaria@gmail.com 2

Tipos de Triggers

O MYSQL 5 permite a criao de dois tipos de triggers: BEFORE (Insert, Delete, Update): As Triggers BEFORE so executadas antes da ao original que poder ser um insert, update ou delete; AFTER (Insert, Delete, Update): As Trigger After so executadas aps o evento original que poder ser um insert, update ou delete;

Administrao e Projeto de Banco de Dados - Uniban Brasil - profmauriciofaria@gmail.com

Operadores das Triggers


Em meio aos TRIGGERS temos dois operadores importantssimos que nos possibilitam acessar as colunas da tabela alvo do comando DML. Os operadores NEW e OLD. Antes mesmo de analisarmos os operadores, temos que analisar as seguintes diretrizes:

INSERT: o operador NEW.nome_coluna, nos permite verificar o valor enviado para ser inserido em uma coluna de uma tabela. OLD.nome_coluna no est disponvel. DELETE: o operador OLD.nome_coluna nos permite verificar o valor excludo ou a ser excludo. NEW.nome_coluna no est disponvel.
Administrao e Projeto de Banco de Dados - Uniban Brasil - profmauriciofaria@gmail.com 4

Operadores das Triggers


UPDATE: tando OLD.nome_coluna quanto NEW.nome_coluna esto disponveis, antes (BEFORE) ou depois (AFTER) da atualizao da linha.

Administrao e Projeto de Banco de Dados - Uniban Brasil - profmauriciofaria@gmail.com

Sintaxe
DELIMITER// CREATE TRIGGER <nome da trigger> <tipo de trigger [before/after]> <evento mapeado [insert/update/delete]> ON <nome da tabela> FOR EACH ROW BEGIN <corpo da trigger>; END //
Administrao e Projeto de Banco de Dados - Uniban Brasil - profmauriciofaria@gmail.com 6

Vamos criar um pequeno exemplo:


Proposta: Uma tabela que representa os itens do carrinho de compras (ITEMPEDIDO). Para cada produto includo nessa tabela temos que fazer a baixa do estoque na tabela de produtos:
ITEMPEDIDO CODIGOPRODUTO 1 2 CODIGOPEDIDO 10 10 QTD 1 3

Fazemos o UPDATE da quantidade em estoque de acordo com o cdigo do produto e a quantidade inseridas na tabela de ITEMPEDIDO.
PRODUTOS CODIGOPRODUTO NOME QTDESTOQUE

1 2

DVD LIQUIDIFIC

100 30
7

Administrao e Projeto de Banco de Dados - Uniban Brasil - profmauriciofaria@gmail.com

Criando a nossa primeira trigger


DELIMITER //

CREATE TRIGGER nm_atualiza_estoque AFTER INSERT ON ITEMPEDIDO


FOR EACH ROW BEGIN -- UTILIZANDO VARIAVEIS

SET @CODIGOPRODUTO = NEW.CODIGOPRODUTO;


SET @QTD = NEW.QTD; -- TESTANDO OS VALORES RECUPERADOS

IF (@CODIGOPRODUTO IS NOT NULL AND @QTD IS NOT NULL) THEN


UPDATE PRODUTOS SET QTDESTOQUE = QTDESTOQUE - @QTD

WHERE CODIGOPRODUTO= @CODIGOPRODUTO;


END IF; END ;

//

Administrao e Projeto de Banco de Dados - Uniban Brasil - profmauriciofaria@gmail.com

Exemplo de Triggers
A Trigger a seguir simples, mas requer algumas explicaes.

Proposta: Suponha que o Diretor de uma empresa que utiliza um sistema desenvolvido por voc, e deseja saber quais usurios realizam alteraes nos preos das mercadorias.
preciso ainda saber quando e de onde (estao) esta alterao foi feita. Vamos utilizar como cenrio o Banco de Dados Northwind, e tabela a Products. Esta tabela possui um campo chamado UnitPrice, onde esta armazenado o preo atual do produto. Ento criaremos uma Trigger After update, que ser chamada de Auditaria. Vamos precisar ainda de uma tabela para armazenar a auditoria.
Administrao e Projeto de Banco de Dados - Uniban Brasil - profmauriciofaria@gmail.com 9

Tabela Products do banco Northwind

Administrao e Projeto de Banco de Dados - Uniban Brasil - profmauriciofaria@gmail.com

10

Tabela que guardar dados da auditoria


CREATE TABLE tab_audit( codigo int AUTO_INCREMENT PRIMARY_KEY, usuario char(30) NOT NULL, estacao char(30) NOT NULL, dataautitoria timestamp NOT NULL, codigo_Produto int NOT NULL, preco_unitario_novo DECIMAL(10,4) NOT NULL, preco_unitario_antigo DECIMAL(10,4) NOT NULL );

Note que os campos sero preenchidos no INSERT ocasionado pela execuo da TRIGGER;

Administrao e Projeto de Banco de Dados - Uniban Brasil - profmauriciofaria@gmail.com

11

Exemplo da trigger completo


A Trigger completa ficou assim:
DELIMITER // CREATE TRIGGER Audita AFTER UPDATE ON PRODUCTS FOR EACH ROW BEGIN SET @CODIGOPRODUTO = OLD.PRODUCTID; SET @PRECONOVO = NEW.UNITPRICE; SET @PRECOANTIGO=OLD.UNITPRICE; INSERT INTO TAB_AUDIT (usuario ,estacao ,codigo_Produto ,preco_unitario_novo, preco_unitario_antigo) VALUES (CURRENT_USER,USER(), @CODIGOPRODUTO, @PRECONOVO,@PRECOANTIGO); END //
Administrao e Projeto de Banco de Dados - Uniban Brasil - profmauriciofaria@gmail.com 12

Executando a trigger Para testar altere alguns preos de produtos e depois leia o contedo da tabela TAB_AUDIT Passo 1 UPDATE products SET unitprice = 12.5 productId = 100 Passo 2 SELECT * FROM TAB_AUDIT;
Administrao e Projeto de Banco de Dados - Uniban Brasil - profmauriciofaria@gmail.com 13

You might also like