Baixe o app para aproveitar ainda mais
Prévia do material em texto
Programação em Banco de Dados Triggers de Banco de Dados Triggers (ou gatilhos) são semelhantes as procedures ou funções, pelo fato de serem blocos identificados PL/SQL com seções declarativas, executáveis e de tratamento de exceções. Por outro lado, um trigger é executado implicitamente sempre que o evento desencadeador acontece. Um trigger também não aceita argumentos. Os triggers têm várias utilidades, incluindo: • Manter restrições complexas de integridade • Fazer auditoria das informações com detalhes • Sinalizar automaticamente a outros programas que uma ação precisa acontecer quando são feitas alterações em uma tabela Programação em Banco de Dados Sintaxe para criação de triggers: CREATE OR REPLACE TRIGGER <trigger_name> <BEFORE | AFTER> <ACTION> [OR <ACTION> OR <ACTION>] ON <table_name> DECLARE <variable definitions> BEGIN <trigger_code> EXCEPTION <exception clauses> END <trigger_name>; Programação em Banco de Dados Os triggers de DML são acionados em uma operação INSERT, UPDATE ou DELETE de uma tabela de banco de dados. Pode ser acionado antes ou depois que uma instrução é executada e pode ser acionado uma vez por linha ou uma vez por instrução. Exemplo: CREATE OR REPLACE TRIGGER ClassesAStatement1 AFTER UPDATE ON classes BEGIN INSERT INTO temp_table (num_col, char_col) VALUES (trig_seq.NEXTVAL, ‘teste '); END ClassesAStatement1; Programação em Banco de Dados Identificadores de correlação em triggers de nível de linha Um trigger FOR EACH ROW é acionado uma vez por linha. Dentro do trigger, você pode acessar os dados da linha que está sendo processada atualmente. Isso é realizado através dos identificadores :NEW e :OLD. Esses identificadores são semelhantes a uma variável do tipo registro TABELA_DA_TRIGGER%ROWTYPE. Devemos observar que :OLD é NULL para triggers em instruções INSERT, e :NEW é NULL para instruções DELETE. Programação em Banco de Dados Exemplo: CREATE OR REPLACE TRIGGER GenerateStudentID BEFORE INSERT ON students FOR EACH ROW BEGIN SELECT student_sequence.NEXTVAL INTO :new.ID FROM dual; END GenerateStudentID; Programação em Banco de Dados A cláusula WHEN É válida apenas para triggers FOR EACH ROW. Quando presente, a trigger será executada apenas para aquelas linhas que satisfação a condição especificada. Ela será avaliada para cada linha processada. Os registros :new e :old também podem ser referenciados dentro da cláusula WHEN, mas os dois-pontos não são utilizados. Exemplo: CREATE OR REPLACE TRIGGER CheckCredits BEFORE INSERT OR UPDATE OF current_credits ON students FOR EACH ROW WHEN (new.current_credits > 20) BEGIN /* corpo de trigger aquí */ END; Programação em Banco de Dados Predicados de trigger: INSERTING, UPDATING e DELETING Um mesmo trigger pode ser disparado para INSERT, UPDATE e DELETE. Dentro de um trigger desse tipo há três funções booleanas que podem ser usadas para determinar qual é a operação que está disparando o trigger. Exemplo: CREATE OR REPLACE TRIGGER LogRSChanges BEFORE INSERT OR DELETE OR UPDATE ON registered_students FOR EACH ROW DECLARE v_ChangeType CHAR(1); Programação em Banco de Dados BEGIN IF INSERTING THEN v_ChangeType := 'I'; ELSIF UPDATING THEN v_ChangeType := 'U'; ELSE v_ChangeType := 'D'; END IF; INSERT INTO RS_audit (change_type, changed_by, timestamp, old_student_id, old_department, old_course, old_grade, new_student_id, new_department, new_course, new_grade) VALUES (v_ChangeType, USER, SYSDATE, :old.student_id, :old.department, :old.course, :old.grade, :new.student_id, :new.department, :new.course, :new.grade); END LogRSChanges;
Compartilhar