Enviado por Do utilizador1959

Trigger Mysql

Propaganda
Banco de Dados II
COMO FAZER Trigger no MySQL
Prof. Bruno Rossi
Email: [email protected]
http://bit.ly/uemg-si
Banco de Dados II
O que é Trigger?
• "Gatilho ou 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."
Banco de Dados II
• Sobre os eventos, eles são relacionados com alterações nas
tabelas, como inserções ou exclusões, por exemplo.
• Você pode configurar uma Trigger pra se executar sempre
que um registro for alterado numa tabela, isso é bem útil
pra criar histórico de alterações.
Banco de Dados II
Banco de Dados II
Criando a Trigger
• 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
Banco de Dados II
• Nome: nome do gatilho, segue as mesmas regras de
nomeação dos demais objetos do banco.
• Momento: quando o gatilho será executado. Os valores
válidos são BEFORE (antes) e AFTER (depois).
• Evento: evento que vai disparar o gatilho. Os valores
possíveis são INSERT, UPDATE e DELETE.
• Tabela: nome da tabela a qual o gatilho está associado.
Banco de Dados II
• Dá só uma olhada nas opções de eventos disponíveis:
– Before insert (Antes de inserir)
– After insert (Depois de inserir)
– Before update (Antes de atualizar)
– After update (Depois de atualizar)
– Before delete (Antes de apagar)
– After delete (Depois de apagar)
Banco de Dados II
CREATE TRIGGER nome momento evento
ON tabela
FOR EACH ROW
BEGIN
/*corpo do código*/
END
Banco de Dados II
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
gatilhos AFTER INSERT na mesma tabela.
Banco de Dados II
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 gatilhos 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.
Banco de Dados II
• OLD.preco
• NEW.preco
• OLD.nome
• NEW.nome
Função NOW ()
Banco de Dados II
• Função que retorna a data e hora do sistema.
SELECT NOW();
Função CURDATE ()
Banco de Dados II
• Retorna somente a data.
SELECT CURDATE();
Banco de Dados II
DELIMITER $
CREATE TRIGGER Tgr_Produto_Update AFTER UPDATE
ON produtos
FOR EACH ROW
BEGIN
INSERT INTO historico_preco_produtos (pkHisProduto, fkProduto,
data, precoAntigo, precoNovo) VALUES (NULL, OLD.pkProduto,
CURDATE(), OLD.preco, new.preco);
END$
DELIMITER ;
Banco de Dados II
• Como usaremos instruções que requerem ponto e vírgula no
final, alteraremos o delimitador de instruções para $$ e
depois de criar os triggers, voltaremos para o padrão.
• Essa alteração não está diretamente ligada aos triggers.
Banco de Dados II
Banco de Dados II
ALTER TABLE `produtos` ADD `quantidade` INT NOT NULL AFTER
`preco`;
CREATE TABLE ItensVenda
(
pkItenVenda int PRIMARY KEY,
Venda
INT,
fkProduto int,
Quantidade INT,
FOREIGN KEY(fkProduto) REFERENCES produtos (pkProduto)
);
Banco de Dados II
Banco de Dados II
Banco de Dados II
DELIMITER $
CREATE TRIGGER Tgr_ItensVenda_Insert AFTER INSERT
ON itensvenda
FOR EACH ROW
BEGIN
UPDATE produtos p SET p.quantidade = p.quantidade - NEW.Quantidade
WHERE p.pkProduto= NEW.fkProduto;
END$
CREATE TRIGGER Tgr_ItensVenda_Delete AFTER DELETE
ON itensvenda
FOR EACH ROW
BEGIN
UPDATE produtos p SET p.quantidade = p.quantidade + OLD.Quantidade
WHERE p.pkProduto= OLD.fkProduto;
END$
DELIMITER ;
Banco de Dados II
Banco de Dados II
Banco de Dados II
DELIMITER $
CREATE TRIGGER Tgr_ItensVenda_InsertBefore BEFORE INSERT
ON itensvenda
FOR EACH ROW
BEGIN
IF (NEW.Quantidade> (SELECT p.quantidade FROM produtos p WHERE
p.pkProduto=NEW.fkProduto)) THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Quantidade maior do que o
estoque !';
End IF;
END$
DELIMITER ;
Banco de Dados II
Banco de Dados II
Banco de Dados II
• https://www.devmedia.com.br/mysql-basico-triggers/37462
• https://ayltoninacio.com.br/blog/criando-trigger-no-mysqlem-poucos-minutos
Download