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