Prof. Josenildo Silva

Documentos relacionados
Programando em SQL. Triggers, Stored Procedures e funções. Profa. Késsia Marchi

SQL Gatilhos (Triggers)

Triggers(Gatilhos) Tiago Alves de Oliveira

Linguagem SQL Restrições, Triggers e Views

Oracle PL/SQL Triggers

BANCO DE DADOS TRIGGERS (GATILHOS) Prof. Fabiano Papaiz IFRN

Avisos. Sumário. Atividade em lab Aula 29. Atividade em lab Aula 29. Programando com SQL Triggers EXERCÍCIO LAB SP. Vista da segunda prova

Material Teórico. Procedures, Functions, Exceptions e Triggers. Responsável pelo Conteúdo: Prof. Ms. Alexander Gobbato Albuquerque

Restrições de Integridade Semântica

Stored Procedures e Triggers

IMPLEMENTAÇÃO DE BANCO DE DADOS

BANCO DE DADOS II Prof. Ricardo Rodrigues Barcelar

Funções Definidas pelo Usuário

Banco de Dados II. Triggers e Functions. Prof. Moser Fagundes. Curso TSI Instituto Federal Sul-Rio-Grandense (IFSul) Campus Charqueadas


Uma solução possível para garantir, em ambiente APEX, a consistência duma estrutura ISA, total e disjuntiva.

BD II (SI 587) Procedimentos Armazenados

PROGRAMAÇÃO EM BANCO DADOS Stored Procedure e Trigger

Oracle 10g: SQL e PL/SQL

Sistemas de Informação

TRIGGER e SEGURANÇA. Prof. Edson Thizon

Administração de Banco de Dados

BANCO DE DADOS. info 3º ano. Prof. Diemesleno Souza Carvalho

Triggers em PostgreSQL. Linguagem de Programação de Banco de Dados. Triggers em PostgreSQL. Triggers em PostgreSQL

SQL Procedural. Josino Rodrigues Neto

trigger insert, delete, update

Lista 02 Sistema de Banco de Dados CAP 241 Computação Aplicada I

PROGRAMAÇÃO EM BANCO DADOS Store Procedure e Trigger

ESTUDO DE CASO EM PL/SQL

Tabelas. Banco de Dados I MySQL

Triggers. um trigger permite que uma determinada sequência de comandos SQL seja accionada quando um determinado evento ocorre.

Triggers no PostgreSQL

Bancos de Dados I. Integridade semântica

Restrições ao Domínio Integridade Referencial Asserções Triggers Segurança e Autorizações


Triggers e Regras. Fernando Lobo. Base de Dados, Universidade do Algarve

Sistemas de Informação e Bases de Dados 2012/2013. Stored Procedures e Triggers

BD Oracle. Licenciatura em Engenharia Informática e Computação. Bases de Dados 2003/04

Banco de Dados I Introdução SQL

Marcos Alexandruk Marcos Alexandruk

Banco de Dados Avançados Banco de Dados Ativo

Tratamento de Exceções

26/04/2017 Triggers no SQL Server: teoria e prática aplicada em uma situação real

Banco de dados. Conteúdo: DDL Prof. Patrícia Lucas

Create Sequence Cria uma sequence. Uma sequence é um objeto que permite vários usuários gerarem valores inteiros sem repetição.

SQL Linguagem de Definição de Dados. Laboratório de Bases de Dados Profa. Dra. Cristina Dutra de Aguiar Ciferri

Banco de Dados II. PL/SQL - Procedures -Cursor - Funções. Segurança: Introdução; Controle de Acesso; Criptografia; Recursos de SQL.

Aula de SQL Comandos DDL. André Luiz de Oliveira Eduardo Raul Hruschka

Triggers em SQLite. Fernando Lobo. Base de Dados, Universidade do Algarve

f. Exemplo: verificar condição de aprovação de alunos

SQL Linguagem de Definição de Dados

Introdução às funções e procedimentos. SQL suporta funções e procedimentos úteis com tipos de dados específicos

PL/pgSQL. Introdução. Introdução. Introdução

PROCEDIMENTOS ARMAZENADOS (Stored Procedures)

Fundamentos de Programação ORACLE: SQL. Prof. Walter Gima

TECNOLOGIA EM SISTEMAS PARA INTERNET PROJETO DE BANCO DE DADOS

Disciplina: Banco de Dados Tema: SQL Parte 2

Logado no OracleXE vamos acessar a opção:


BANCO DE DADOS BANCO DE DADOS. Prof. Patrícia Lucas 3º Trimestre

SQL Linguagem de Definição de Dados. Banco de Dados Profa. Dra. Cristina Dutra de Aguiar Ciferri

PHP INTEGRAÇÃO COM MYSQL PARTE 1

Banco de Dados I. Aula 12 - Prof. Bruno Moreno 04/10/2011

Uma solução possível para garantir, em ambiente APEX, a consistência duma estrutura ISA total e disjuntiva.

Rápida revisão do Modelo Relacional

Oracle Comandos para Processamento de Transações

GBC043 - Sistemas de Banco de Dados Funções e Gatilhos no PostgreSQL

Bases de Dados 2012/2013 Funções/procedimentos e triggers. Helena Galhardas 2012 IST. Bibliografia. Manual referência PostgreSQL

Aula 06 Sistemas Embarcados LT38C

Structured Query Language (SQL) Ambiente Simplificado de um SGBD

S Q L Asserções, Visões e Técnicas de Programação. Daniel Bordignon Cassanelli Fernando Luiz Grando Pedro Patitucci Finamore

Introdução à linguagem SQL

BCD29008 Banco de dados

PL/pgSQL por Diversão e Lucro

UNINGÁ UNIDADE DE ENSINO SUPERIOR INGÁ FACULDADE INGÁ CIÊNCIA DA COMPUTAÇÃO CURSORS. Profº Erinaldo Sanches Nascimento

A linguagem SQL

TRIGGERS Temas abordados

BDII SQL TRANSAÇÃO Revisão 2

Transcrição:

BD II (SI 587) Gatilhos (Triggers) Prof. Josenildo Silva jcsilva@ifma.edu.br

Motivação Algumas rotinas precisam ser executadas antes ou depois de um determinado evento no banco de dados

Motivação Regras de negócios complexas precisam ser verificadas a cada operação do banco de dados

Motivação Somente com visões, funções e procedimentos não é possível realizar nenhuma das duas situações

TRIGGERS

O que são triggers? É um conjunto de operações executadas automaticamente quando uma alteração é feita em uma tabela

Execução É disparada (pelo SGBD) antes ou depois de um INSERT, UPDATE ou DELETE Pode haver até seis triggers por tabela

Utilização de Triggers Atender regras de negócios Verificar a integridade dos dados, pois é possível fazer uma verificação antes da inserção do registro Contornar erros na regra de negócio do sistema no banco de dados; Auditar as mudanças nas tabelas.

Exemplos Aprovar financiamento maiores que um determinado valor Atualizar uma tabela de auditoria após alteração de um registro em outra tabela. 9

Triggers em SQL Comando CREATE TRIGGER Um trigger típico tem três componentes: Evento(s) Condição Ação

Triggers em SQL Comando CREATE TRIGGER Um trigger típico tem três componentes: Evento(s) Condição Ação

Triggers em SQL Comando CREATE TRIGGER Um trigger típico tem três componentes: Evento(s) Condição Ação

Acesso a outras tabelas Uma TRIGGER é sempre associada a uma tabela, porém os seus comandos podem acessar dados de outras tabelas 13

Exemplo de acesso a outras tabelas Dadas as tabelas Nota_Fiscal(Num_nota, valor_total) Produto(Cod_Prod, nome, preço, estoque) Nota_Prod(Num_nota, Cod_Prod, quantidade) Pode-se criar uma trigger para a operação de INSERT na tabela Nota_Prod que atualiza o nível de estoque do produto vendido *

Eventos em cascata Pode-se usar TRIGGERS para exclusão e atualização em cascata Se um comando executado violar uma CONSTRAINT, a TRIGGER não irá disparar. *

Restrições Não são permitidos os seguintes comandos: ALTER DATABASE, CREATE DATABASE, DROP DATABASE, LOAD DATABASE, LOAD LOG, RESTORE DATABASE, RESTORE LOG, RECONFIGURE

Palavras chave OLD e NEW As triggers tem acesso a duas tabelas em memória referenciadas pelas palavra chave OLD e NEW

Palavras chave OLD e NEW :OLD e :NEW (No mysql se omite os dois pontos) Quando a operação for de insert temos acesso apenas a tabela :new Quando a operação for de update temos acesso as tabela :old, :new Quando a operação for de delete temos acesso apenas a tabela :old

TRIGGERS NO MYSQL

Triggers no MySQL Será criado uma trigger para cada evento das tabelas ENTRADA_PRODUTO e SAIDA_PRODUTO Nota: o MySQL não suporta múltiplos eventos em uma mesma trigger

Triggers no MySQL Padrão de nomeclatura trg + nome da tabela + id do evento AI : After Insert (Após Inserção) AU: After Update (Após Atualização) AD: After Delete (Após Exclusão)

Triggers no MySQL Serão criadas as seguintes triggers: trg_entradaproduto_ai; trg_entradaproduto_au; trg_entradaproduto_ad; trg_saidaproduto_ai; trg_saidaproduto_au; trg_saidaproduto_ad.

Triggers no MySQL TRIGGER trg_entradaproduto_ai DELIMITER $$ CREATE TRIGGER trg_entradaproduto_ai AFTER INSERT ON entrada_produto FOR EACH ROW BEGIN CALL sp_atualizaestoque (new.id_produto, new.qtde, new.valor_unitario); END $$ DELIMITER ;

Triggers no MySQL TRIGGER trg_entradaproduto_au DELIMITER $$ CREATE TRIGGER trg_entradaproduto_au AFTER UPDATE ON entrada_produto FOR EACH ROW BEGIN CALL sp_atualizaestoque (new.id_produto, new.qtde - old.qtde, new.valor_unitario ); END $$ DELIMITER;

Triggers no MySQL TRIGGER trg_entradaproduto_ad DELIMITER $$ CREATE TRIGGER trg_entradaproduto_au AFTER DELETE ON entrada_produto FOR EACH ROW BEGIN CALL sp_atualizaestoque (old.id_produto, old.qtd * -1, old.valor_unitario ); END $$ DELIMITER;

Triggers no MySQL TRIGGER trg_saidaproduto_ai DELIMITER $$ CREATE TRIGGER trg_saidaproduto_ai AFTER INSERT ON saida_produto FOR EACH ROW BEGIN CALL sp_atualizaestoque (new.id_produto, new.qtde * -1, new.valor_unitário); END $$ DELIMITER;

Triggers no MySQL TRIGGER trg_saidaproduto_au DELIMITER $$ CREATE TRIGGER trg_saidaproduto_au AFTER UPDATE ON saida_produto FOR EACH ROW BEGIN CALL sp_atualizaestoque (new.id_produto, old.qtde - new.qtde, new.valor_unitario); END $$ DELIMITER;

Triggers no MySQL TRIGGER trg_saidaproduto_ad DELIMITER $$ CREATE TRIGGER trg_saidaproduto_ad AFTER DELETE ON saida_produto FOR EACH ROW BEGIN CALL sp_atualizaestoque (old.id_produto, old.qtde, old.valor_unitário); END $$ DELIMITER;

Habilitando e Desabilitando Trigger Para desabilitar temporariamente uma trigger: ALTER TABLE Nome_da_Tabela DISABLE TRIGGER Nome_da_Trigger Para habilitar novamente uma trigger: ALTER TABLE Nome_da_Tabela ENABLE TRIGGER Nome_da_Trigger 29

TRIGGERS NO ORACLE

Triggers no Oracle Trigger são blocos PL/SQL associados com tabelas, views, esquemas

Triggers no Oracle Triggers de DML (INSERT, UPDATE e DELETE) Também: triggers INSTEAD OF para visões Triggers de DDL (CREATE, ALTER e DROP) Triggers de sistema

Triggers de DML - Sintaxe CREATE [OR REPLACE] TRIGGER <nome> {timing} event1 event2... ON {tabela} [FOR EACH ROW WHEN (predicado)] {corpo_trigger}

Exemplo 1: Trigger before-statement CREATE OR REPLACE TRIGGER BEF_STA BEFORE INSERT ON TB_AUX BEGIN DBMS_OUTPUT.PUT_LINE('Inside a BEFORE STMT TRIGGER!'); -- USE THE FOLLOWING LINE TO CANCEL THE ACTION -- RAISE_APPLICATION_ERROR(-20200,'TEST'); END; -- TESTING INSERT INTO TB_AUX VALUES(1,'A') INSERT INTO TB_AUX VALUES(2,'B') INSERT INTO TB_AUX VALUES(3,'C') SELECT * FROM TB_AUX;

Exemplo 2: Trigger before-row CREATE OR REPLACE TRIGGER BEF_ROW BEFORE UPDATE OF NAME ON TB_AUX FOR EACH ROW BEGIN DBMS_OUTPUT.PUT_LINE('Inside a BEFORE ROW TRIGGER!'); END; -- TESTING UPDATE TB_AUX SET NAME = '' WHERE ID = 100; UPDATE TB_AUX SET ID = 0; UPDATE TB_AUX SET NAME = ''; SELECT * FROM TB_AUX;

Predicados, e tabelas :old e :new Predicados indicam o tipo do trigger DELETING, INSERTING e UPDATING Tabelas :old e :new Em memória, com dados relacionados à instrução que disparou o trigger

Exemplo 3: Trigger com predicados CREATE OR REPLACE TRIGGER AFT_STA AFTER INSERT OR UPDATE OR DELETE ON TB_AUX BEGIN IF DELETING THEN RAISE_APPLICATION_ERROR(-20200,'DELETE CANCELED!'); ELSEIF INSERTING THEN RAISE_APPLICATION_ERROR(-20200,'INSERT CANCELED!'); ELSEIF UPDATING('NAME') THEN RAISE_APPLICATION_ERROR(-20200,'UPDATE CANCELED!'); END IF; END; -- TESTING SELECT * FROM TB_AUX; DELETE TB_AUX WHERE ID = 0 -- TESTING INSERT INTO TB_AUX VALUES(4,'D') UPDATE TB_AUX SET NAME = 'Z'

Exemplo 4: Trigger com :new e :old CREATE OR REPLACE TRIGGER AFT_ROW AFTER INSERT OR UPDATE OR DELETE ON TB_AUX FOR EACH ROW BEGIN IF DELETING THEN DBMS_OUTPUT.PUT_LINE('OLD ID:' TO_CHAR(:OLD.ID) ); DBMS_OUTPUT.PUT_LINE('OLD NAME:' TO_CHAR(:OLD.NAME) ); ELSIF INSERTING THEN DBMS_OUTPUT.PUT_LINE('NEW ID:' TO_CHAR(:NEW.ID)); DBMS_OUTPUT.PUT_LINE('NEW NAME:' TO_CHAR(:NEW.NAME)); ELSIF UPDATING('NAME') THEN DBMS_OUTPUT.PUT_LINE('NEW ID:' TO_CHAR(:NEW.ID) ); DBMS_OUTPUT.PUT_LINE('OLD ID:' TO_CHAR(:OLD.ID) ); DBMS_OUTPUT.PUT_LINE('NEW NAME:' TO_CHAR(:NEW.NAME) ); DBMS_OUTPUT.PUT_LINE('OLD NAME:' TO_CHAR(:OLD.NAME) ); END IF; END;

Exemplo 4: cont. -- TESTING SELECT * FROM TB_AUX; DELETE TB_AUX WHERE ID = 0 INSERT INTO TB_AUX VALUES(4,'D') UPDATE TB_AUX SET NAME = 'Z'

Exemplo 5: cláusula WHEN CREATE OR REPLACE TRIGGER AFT_WHEN AFTER INSERT ON TB_AUX FOR EACH ROW WHEN (NEW.ID = 10) BEGIN DBMS_OUTPUT.PUT_LINE('Novo ID igual a 10'); END; -- TESTE SELECT * FROM TB_AUX; INSERT INTO TB_AUX VALUES(9,'M'); INSERT INTO TB_AUX VALUES(10,'N'); INSERT INTO TB_AUX VALUES(11,'O'); DROP TRIGGER AFT_WHEN;

Exemplo 6: cláusula WHEN CREATE OR REPLACE TRIGGER Print_salary_changes BEFORE DELETE OR INSERT OR UPDATE ON emp FOR EACH ROW WHEN (NEW.EMPNO > 0) DECLARE sal_diff number; BEGIN sal_diff := :NEW.SAL - :OLD.SAL; dbms_output.put('old salary: ' :OLD.sal); dbms_output.put('new salary: ' :NEW.sal); dbms_output.put_line('diff: ' sal_diff ); END;

Trigger instead of para Visões CREATE VIEW VW_AUX AS SELECT * FROM TB_AUX; CREATE OR REPLACE TRIGGER TR_IO INSTEAD OF INSERT ON VW_AUX FOR EACH ROW BEGIN INSERT INTO TB_AUX VALUES(:NEW.ID, :NEW.NAME); END; -- TESTES SELECT * FROM VW_AUX; SELECT * FROM TB_AUX; INSERT INTO VW_AUX VALUES(99,'W');

SEQUÊNCIA DE DISPARO para triggers no Oracle BEFORE STATEMENT BEFORE ROW AFTER ROW CONSTRAINTS CHECK AFTER STATEMENT