SCC Bancos de Dados e Suas Aplicações

Slides:



Advertisements
Apresentações semelhantes
O Comando DROP INDEX Para eliminar um índice definido sobre uma tabela, utilize: Drop Index on ; Ex: No Access: Drop Index X on.
Advertisements

Gerenciamento de Dados e Informação Estudo de caso – PL/SQL
Triggers Renata Viegas.
SQL Structured Query Language
BANCO DE DADOS EM APLICATIVOS WEB Aula 13
Prof.: Bruno Rafael de Oliveira Rodrigues
Banco de Dados Prof.: Bruno Rafael de Oliveira Rodrigues.
Prof.: Bruno Rafael de Oliveira Rodrigues
Banco de Dados SQL TRIGGERS (Gatilhos)
SISTEMAS DE INFORMAÇÃO Sistemas de Bancos de Dados 2º Semestre – 2010 Pedro Antonio Galvão Junior Fone:
SISTEMAS DE INFORMAÇÃO Sistemas de Bancos de Dados II 1º Semestre – 2010 Pedro Antonio Galvão Junior Fone:
Maurício Edgar Stivanello
Sistema Gerenciador de Banco de Dados SGBD
Restrições de Integridade
Restrições de Integridade
Introdução à Engenharia da Computação
SCC Bancos de Dados e Suas Aplicações
SCC Bancos de Dados e Suas Aplicações
SCC Bancos de Dados e Suas Aplicações
SCC Bancos de Dados e Suas Aplicações
MySQL Gerdson de Araújo Silva Universidade Federal de Alagoas Maceió-AL, 21 de maio de 2009.
Bancos de Dados – SQL – parte 1
Triggers e StoreProcedures
Banco de dados Profª Kelly Medeiros.
PostgreSQL.
Equipe de monitoria Aula prática 4.  Tipos  Tabela de Objetos  Herança  Métodos  Referências  Coleções  Composição de coleções  Conectividade.
PL/SQL, Procedures e Funções
Tópicos de Sistemas de Informação A Carlos Oberdan Rolim Ciência da Computação.
Monitoria GDI Aula Prática
Tipos de Linguagens do Banco de Dados
(Linguagem de Consulta Estruturada)
Equipe de monitoria Aula prática 3.  Caso de estudo  Igualando situações  Cursor  Function  Procedure  Trigger  Package  Surpresa...
Equipe de monitoria Aula prática 4
Primeira aula de PL/SQL Parte II
Monitoria GDI Aula Prática
Oracle 9i: SQL e PL/SQL Bruno Celso Cunha de Freitas
SEQUENCE, PROCEDURE, FUNÇÃO, TRIGGER
Monitoria GDI Aula Prática
Desenvolvendo um script SQL
VIEW - VISÕES Professor Esp. Diego André Sant’Ana
BANCOS DE DADOS ATIVOS Weyler M Lopes © Especialização em Banco de Dados.
Banco de dados.
Revisão ER /SQL / PL.
Linguagem de Definição de Dados
Aula Prática PL/SQL Profa. Bernadette Farias Lóscio
Baseado no material do Professor Raul Paradeda
Definições de Esquemas, Restrições básicas e buscas
Monitoria GDI Aula Prática Aula 2: PL 1. Estudo de caso - continuação Pegar arquivo GDI.zip em Descompactar arquivo: o criacaoTabelas.SQL.
Triggers (Gatilhos) Professor Esp. Diego André Sant’Ana
SCC Bancos de Dados e Suas Aplicações
Banco de Dados I I Comandos SQL
Fundamentos de Banco de Dados Fundamentos de Banco de Dados Prof. Gale 2º. Semestre 2008.
CASE WHEN THEN ELSE END Professor Esp. Diego André Sant’Ana Disciplina: Banco de Dados II professordiegosantana.wordpress.com.
©Silberschatz, Korth and Sudarshan (modificado)9.2.1Database System Concepts Capítulo 9: BDs Objecto-Relacional Relações imbricadas Tipos complexos e objectos.
Equipe de monitoria Aula prática 4.  Tipos  Tabela de Objetos  Herança  Métodos  Referências  Coleções  Composição de coleções  Conectividade.
7P/SI – 2010/01 Prof. Carlos Alberto Seixas. Agenda Visão Geral sobre os Conceitos e Implementação sobre SGBs MySQL Revisão das Práticas Práticas 1 e.
IEC Banco de Dados I Aula 04 – SQL (II) Turmas: Sistemas de Informação Professora: André Luiz da Costa Carvalho
SQL (Structured Query Language)
1 Introdução à Manipulação de Dados SQL – Structured Query Language  Tabela = Relação  DDL – Data Definition Language  Sub-conjunto do SQL que suporta.
Daniel Paulo SQL Server 2014 Módulo II Daniel Paulo
Linguagem de definição de dados - SQL
Monitoria GDI Aula Prática Aula 1: SQL + PL 1. Estudo de caso - continuação Pegar arquivo GDI.zip em Descompactar arquivo: o criacaoTabelas.SQL.
Aula 13 - Triggers. Triggers no SGBD Postgres  Os Triggers (Gatilhos) são funções preparadas para serem disparadas no caso de alguma alteração ocorrer.
Banco de Dados II Prof: Márcio Soussa Curso de Sistemas de Informação Faculdades Jorge Amado.
2/6/2016 José Antônio da Cunha - CEFET - RN1 Programação de Banco de Dados Funções.
Programação para Internet Aula 11 SQL (Introdução a linguagem, comandos de modificação: Create, Drop, Alter, Insert, Delete, Update)
Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Capítulo 5 Mais SQL: Consultas Complexas, Triggers e Views.
BANCO DE DADOS Araújo Lima Out / 2017 Araújo.
Transcrição da apresentação:

SCC0141 - Bancos de Dados e Suas Aplicações Prof. Jose Fernando Rodrigues Junior Introdução a gatilhos e procedimentos armazenados em PostgreSQL

Triggers em PostgreSQL Todos os bancos de dados comerciais possuem uma linguagem procedural auxiliar para a definição de procedimentos armazenados Definição de regras de negócio Especificação de restrições de integridade não possíveis no modelo relacional Cálculo de atributos derivados Auditoria Adição de funcionalidades ao banco Uma restrição de integridade não possível, por exemplo, é a participação total de ambas as entidades em relacionamentos muitos para muitos.

Triggers em PostgreSQL PostgreSQL não possui uma única linguagem procedural, este SGBD aceita várias linguagens e pode ser estendido para outras PL/pgSQL PL/Tcl PL/Perl PL/Python Entre outras não distribuídas com o SGBD: PL/Java, PL/PHP, PL/Py, PL/R, PL/Ruby, PL/Scheme e PL/sh http://www.postgresql.org/docs/8.1/static/plpgsql-trigger.html

Triggers em PostgreSQL Um dos principais usos de linguagens procedurais em bancos de dados é a definição de gatilhos Gatilhos são execuções disparadas pelo banco em função de EVENTOS que ocorrem Um evento ocorre Em uma tabela De acordo com uma operação, por DML (INSERT, UPDATE ou DELETE) Antes ou depois (AFTER ou BEFORE)

Exemplo O que acontece na base de dados???? Turma = {Sigla, Numero, NAlunos}    Matrícula = {Sigla, Numero, Aluno, Ano, Nota} Deseja-se manter a tabela Turma atualizada de acordo com as remoções ocorridas na tabela Matrícula CREATE OR REPALCE FUNCTION update_turma() RETURNS trigger AS $update_turma$ BEGIN UPDATE Turma SET NAlunos = NAlunos - 1 WHERE Sigla = old.Sigla AND Numero = old.Numero; RETURN NULL; END; $update_turma$ LANGUAGE plpgsql; CREATE TRIGGER NroDeAlunos AFTER DELETE ON Matricula FOR EACH ROW EXECUTE PROCEDURE update_turma(); identificador old refere-se à tabela Matricula The return value of a BEFORE or AFTER statement-level trigger or an AFTER row-level trigger is always ignored; it may as well be null. DELETE FROM matricula WHERE aluno = 222; O que acontece na base de dados????

Exemplo Turma = {Sigla, Numero, NAlunos}    Matrícula = {Sigla, Numero, Aluno, Ano, Nota} Caso se deseje manter a tabela turma atualizada para remoções, inserções e atualizações, teríamos: CREATE OR REPLACE FUNCTION update_turma() RETURNS trigger AS $update_turma$ BEGIN IF (TG_OP = 'DELETE') THEN UPDATE Turma SET NAlunos = NAlunos - 1 WHERE Sigla = old.Sigla AND Numero = old.Numero; ELSIF (TG_OP = 'INSERT') THEN UPDATE Turma SET NAlunos = NAlunos + 1 WHERE Sigla = new.Sigla AND Numero = new.Numero; ELSIF (TG_OP = 'UPDATE') THEN END IF; RETURN NULL; END; $update_turma$ LANGUAGE plpgsql; DROP TRIGGER NroDeAlunos ON Matricula; CREATE TRIGGER NroDeAlunos AFTER DELETE OR UPDATE OR INSERT ON Matricula FOR EACH ROW EXECUTE PROCEDURE update_turma();

Triggers Identificadores de correlação – variáveis de vínculo PL/SQL sempre vinculados à tabela desencadeadora do trigger instrução old new INSERT NULL valores que serão inseridos UPDATE valores antes da atualização novos valores para a atualização DELETE valores antes da remoção identificador old e new são tratados pelo compilador como registros, mas não são efetivamente... por isso só é possível fazer atribuições aos campos e não como registros inteiros. Trigger after: não é possível escrever em :old e :new Trigger before: não é possível escrever em :old

Triggers em PostgreSQL Definição de regra de negócio Imagine que o esquema de exemplo de aula fosse modificado para que professores pudessem se tornar alunos e se matricular. Aluno = {Nome, Nusp, Idade, DataNasc, CidadeOrigem}    Professor = {Nome, NFunc, Idade, Titulação}  Disciplina = {Sigla, Nome, NCred, Professor, Livro} Turma = {Sigla, Numero, NAlunos}  Matrícula = {Sigla, Numero, Aluno, Ano, Nota} Para o exemplo em sala, não iremos nos preocupar com todos os detalhes desta alteração, trata-se apenas de um exemplo ilustrativo.

Triggers em PostgreSQL Definição de regra de negócio Imagine que o esquema de exemplo de aula fosse modificado para que professores pudessem se tornar alunos e se matricular. Há uma regra de negócio implícita neste caso: *um professor não pode se matricular em disciplinas que ele mesmo ministra Aluno = {Nome, Nusp, Idade, DataNasc, CidadeOrigem}    Professor = {Nome, NFunc, Idade, Titulação}  Disciplina = {Sigla, Nome, NCred, Professor, Livro} Turma = {Sigla, Numero, NAlunos}  Matrícula = {Sigla, Numero, Aluno, Ano, Nota}

Triggers em PostgreSQL CREATE OR REPLACE FUNCTION check_professor() RETURNS trigger AS $check_professor$ DECLARE discs_prof INTEGER; BEGIN SELECT COUNT(*) INTO discs_prof FROM DISCIPLINA WHERE Professor = NEW.Aluno AND Sigla = NEW.Sigla; IF discs_prof > 0 THEN RAISE EXCEPTION 'Um professor não pode se matricular em disciplinas que ele mesmo ministra'; END IF; RETURN NEW; -- retorna a tupla para prosseguir com a operação END; $check_professor$ LANGUAGE plpgsql; DROP TRIGGER check_matricula_de_professor ON Matricula; CREATE TRIGGER check_matricula_de_professor BEFORE INSERT ON Matricula FOR EACH ROW EXECUTE PROCEDURE check_professor();

Triggers em PostgreSQL INSERT INTO ALUNO VALUES('Prof', 20, 35, '05/05/1976','Lins');  o professor 10 se torna aluno E tenta se matricular em sua própria disciplina INSERT INTO MATRICULA VALUES('SC241', 1, 20, 2001, 0); ERRO: Um professor não pode se matricular em disciplinas que ele mesmo ministra ********** Error ********** ERRO: Um professor não pode se matricular em disciplinas que ele mesmo ministra SQL state: P0001 CREATE OR REPLACE FUNCTION check_professor() RETURNS trigger AS $check_professor$ DECLARE discs_prof INTEGER; BEGIN SELECT COUNT(*) INTO discs_prof FROM DISCIPLINA WHERE Professor = NEW.Aluno AND Sigla = NEW.Aluno; IF discs_prof > 0 THEN RAISE EXCEPTION 'Um professor não pode se matricular em disciplinas que ele mesmo ministra'; END IF; RETURN NULL; END; $check_professor$ LANGUAGE plpgsql; DROP TRIGGER check_matricula_de_professor ON Matricula; CREATE TRIGGER check_matricula_de_professor BEFORE INSERT ON Matricula FOR EACH ROW EXECUTE PROCEDURE check_professor();

Triggers em PostgreSQL Auditoria Uma informação particularmente importante é a nota que um aluno recebe quando faz uma disciplina É interessante ter-se um controle de todas as vezes que informações importante são alteradas, como e quando foram alteradas

Triggers em PostgreSQL CREATE TABLE AUDIT_NOTA( id_audit SERIAL PRIMARY KEY, Sigla CHAR(7), Numero SMALLINT, Aluno INTEGER, Ano INTEGER, Nota_anterior DECIMAL(3,1), Nota_nova DECIMAL(3,1), Data DATE --pense nas constraints necessárias.... );

Triggers em PostgreSQL DROP TRIGGER NroDeAlunos ON Matricula; DROP TRIGGER check_matricula_de_professor ON Matricula; CREATE OR REPLACE FUNCTION audit_nota() RETURNS trigger AS $audit_nota$ BEGIN IF OLD.NOTA <> NEW.NOTA THEN INSERT INTO AUDIT_NOTA VALUES(DEFAULT, NEW.Sigla, NEW.Numero, NEW.Aluno, NEW.Ano, OLD.Nota, NEW.Nota, now() ); END IF; RETURN NULL; END; $audit_nota$ LANGUAGE plpgsql; DROP TRIGGER auditoria_de_nota ON Matricula; CREATE TRIGGER auditoria_de_nota AFTER UPDATE ON Matricula FOR EACH ROW EXECUTE PROCEDURE audit_nota();

Triggers em PostgreSQL Especialização/generalização Usando apenas o relacional, nem sempre é possível manter as regras de generalização/especialização Exemplo: esquema condomínio Um funcionário não pode ser ao mesmo tempo permanente e terceirizado – pois definiu-se a especialização como disjunta

Triggers em PostgreSQL (select fucpf from l09_funcionario join l10_permanente on fucpf = pecpf) intersect from l09_funcionario join l11_terceirizado on fucpf = tcpf)  Deve retornar conjunto vazio;  No entanto, sem trigger, nada impede que um funcionário seja inserido em ambas as tabelas. insert into l11_terceirizado values(901, 50, 'Consultoria imoveis'); fará com que o resultado da consulta não seja mais vazia.

Triggers em PostgreSQL CREATE OR REPLACE FUNCTION check_permanente_fc() RETURNS trigger AS $check_permanente_fc$ BEGIN PERFORM * FROM l10_permanente WHERE PECPF = NEW.TCPF; IF FOUND THEN RAISE EXCEPTION 'Este funcionário já se encontra na tabela de permanentes'; END IF; RETURN NEW; -- retorna a tupla para prosseguir com a operação END; $check_permanente_fc$ LANGUAGE plpgsql; DROP TRIGGER check_permanente ON l11_terceirizado; CREATE TRIGGER check_permanente BEFORE UPDATE OR INSERT ON l11_terceirizado FOR EACH ROW EXECUTE PROCEDURE check_permanente_fc(); insert into l11_terceirizado values(901, 50, 'Consultoria imoveis'); fará com que o resultado da consulta não seja mais vazia.

Triggers em PostgreSQL Exercício: escrever o código que garante que uma tupla que esteja em terceirizado não possa ser inserida em permanente. CREATE OR REPLACE FUNCTION check_permanente_fc() RETURNS trigger AS $check_permanente_fc$ BEGIN PERFORM * FROM l10_permanente WHERE PECPF = NEW.TCPF; IF FOUND THEN RAISE EXCEPTION 'Este funcionário já se encontra na tabela de permanentes'; END IF; RETURN NEW; -- retorna a tupla para prosseguir com a operação END; $check_permanente_fc$ LANGUAGE plpgsql; DROP TRIGGER check_permanente ON l11_terceirizado; CREATE TRIGGER check_permanente BEFORE UPDATE OR INSERT ON l11_terceirizado FOR EACH ROW EXECUTE PROCEDURE check_permanente_fc(); insert into l11_terceirizado values(901, 50, 'Consultoria imoveis'); fará com que o resultado da consulta não seja mais vazia.

Triggers em PostgreSQL Consolidação de dados Às vezes os dados podem se encontrar em estados inconsistentes, o que irá requerer intervenção do DBA para corrigir os dados Para tanto, podem-se usar funções não vinculadas a triggers Exemplo: número de alunos da tabela de turmas

Triggers em PostgreSQL alter table turma drop constraint Turma_ck; CREATE OR REPLACE FUNCTION corrige_n_alunos() RETURNS void AS $corrige_n_alunos$ DECLARE cursor_turma CURSOR FOR SELECT * FROM TURMA; turma_row turma%ROWTYPE; total_alunos INTEGER; BEGIN OPEN cursor_turma; LOOP FETCH cursor_turma INTO turma_row; EXIT WHEN NOT FOUND; SELECT COUNT(*) INTO total_alunos FROM MATRICULA WHERE SIGLA = turma_row.SIGLA AND NUMERO = turma_row.NUMERO; UPDATE turma SET nalunos = total_alunos END LOOP; CLOSE cursor_turma; END; $corrige_n_alunos$ LANGUAGE plpgsql; SELECT corrige_n_alunos() Triggers em PostgreSQL Para validar as atualizações do procedimento: select * from turma order by nalunos deve corresponder ao retornado aqui: select t.sigla, t.numero, count(aluno) from turma t left join matricula m on t.sigla = m.sigla and t.numero = m.numero group by t.sigla, t.numero order by count(aluno) desc, t.sigla, t.numero

Triggers em PostgreSQL alter table turma drop constraint Turma_ck; CREATE OR REPLACE FUNCTION corrige_n_alunos() RETURNS void AS $corrige_n_alunos$ DECLARE cursor_turma CURSOR FOR SELECT * FROM TURMA; turma_row turma%ROWTYPE; total_alunos INTEGER; BEGIN OPEN cursor_turma; LOOP FETCH cursor_turma INTO turma_row; EXIT WHEN NOT FOUND; SELECT COUNT(*) INTO total_alunos FROM MATRICULA WHERE SIGLA = turma_row.SIGLA AND NUMERO = turma_row.NUMERO; UPDATE turma SET nalunos = total_alunos END LOOP; CLOSE cursor_turma; END; $corrige_n_alunos$ LANGUAGE plpgsql; SELECT corrige_n_alunos() Triggers em PostgreSQL Exercício: acrescente um atributo booleano na tabela matricula denominado “aprovacao” com valor default “false”. Escreva um procedimento que para cada tupla de matricula que atualize o valor do atributo aprovação, escrevendo “true” caso a nota seja maior ou igual a 5 ou “false” caso contrário. alter table matricula add aprovacao bool default false; CREATE OR REPLACE FUNCTION corrige_aprovacao() RETURNS void AS $corrige_aprovacao$ DECLARE cursor_matricula CURSOR FOR SELECT * FROM MATRICULA; matricula_row matricula%ROWTYPE; BEGIN OPEN cursor_matricula; LOOP FETCH cursor_matricula INTO matricula_row; EXIT WHEN NOT FOUND; IF matricula_row.NOTA >= 5 THEN UPDATE MATRICULA SET aprovacao = 'true' WHERE sigla = matricula_row.sigla and numero = matricula_row.numero and aluno = matricula_row.aluno and ano = matricula_row.ano; ELSE UPDATE MATRICULA SET aprovacao = 'FALSE' END IF; END LOOP; CLOSE cursor_matricula; END; $corrige_aprovacao$ LANGUAGE plpgsql; SELECT corrige_aprovacao();

Triggers de DML Nível Tabela desencadeadora Instrução de disparo INSERT UPDATE DELETE Timing BEFORE AFTER Nível Row (for each row) Statement Em consultas Statement level, a trigger é executada uma única vez e não variáveis NEW e OLD.

Triggers em PostgreSQL Exemplo, nível de statement: CREATE OR REPLACE FUNCTION st_alteracoes_aluno() RETURNS trigger AS $st_alteracoes_aluno$ BEGIN RAISE NOTICE 'Statement - Tentou-se remover dados da tabela Aluno'; RETURN NULL; END; $st_alteracoes_aluno$ LANGUAGE plpgsql; DROP TRIGGER st_alteracoes_aluno_aviso ON ALUNO; CREATE TRIGGER st_alteracoes_aluno_aviso AFTER DELETE ON ALUNO EXECUTE PROCEDURE st_alteracoes_aluno();

Triggers em PostgreSQL Exemplo, nível de rows: CREATE OR REPLACE FUNCTION rw_alteracoes_aluno() RETURNS trigger AS $rw_alteracoes_aluno$ BEGIN RAISE NOTICE 'Rows - Dados foram removidos da tabela Aluno'; RETURN NULL; END; $rw_alteracoes_aluno$ LANGUAGE plpgsql; DROP TRIGGER rw_alteracoes_aluno_aviso; CREATE TRIGGER rw_alteracoes_aluno_aviso AFTER DELETE ON ALUNO FOR EACH ROW EXECUTE PROCEDURE rw_alteracoes_aluno(); select * from aluno INSERT INTO ALUNO VALUES('Antonio', 110, 20, '09/09/1991', DEFAULT) INSERT INTO ALUNO VALUES('Antonia', 111, 20, '09/09/1991', DEFAULT) DELETE FROM aluno WHERE NUSP > 100 Output: NOTA: Rows - Dados foram removidos da tabela Aluno NOTA: Statement - Tentou-se remover dados da tabela Aluno WHERE NUSP > 1000

O que um trigger executa? Suponha os seguintes comandos SQL INSERT INSERT INTO LBD01_VINCULO_USP(NROUSP, TIPOVINC, NOME, DATAINGRESSO) VALUES(21, 2, ‘João’, ‘05/09/2002’) INSERT INTO LBD01_VINCULO_USP(NROUSP, TIPOVINC, NOME, DATAINGRESSO) VALUES(22, 1, ‘Gilberto’, ‘09/05/2000’, ‘05/02/1980’, ‘y’) INSERT INTO LBD01_VINCULO_USP(NROUSP, TIPOVINC, NOME, DATAINGRESSO) VALUES(23, 3, ‘Alfredo’, ‘03/04/2002’, ‘05/04/1982’, ‘y’) UPDATE UPDATE LBD01_VINCULO_USP SET NOME = UPPER(NOME) WHERE NROUSP > 20; DELETE DELETE LBD01_VINCULO_USP SET NOME = UPPER(NOME) Quais são os valores de :old e :new para cada uma destas as operações? old e new são tratados pelo compilador como registros, mas não são efetivamente... por isso só é possível fazer atribuições aos campos e não como registros inteiros. Trigger after: não é possível escrever em :old e :new Trigger before: não é possível escrever em :old

O que um trigger executa? Primeiramente, o corpo do trigger será executado 3 vezes para cada tipo de operação Os valores para cada execução considerando cada operação serão: old new INSERT NroUSP TipoVinc Nome DataIngresso DataNascimento Ativo NULL NroUSP TipoVinc Nome DataIngresso DataNascimento Ativo 21 2 João 05/09/2002 NULL y 22 1 Gilberto 09/05/2000 23 3 Alfredo 03/04/2002 DataNascimento não foi inserido, e Ativo tem valor DEFAULT. old e new são tratados pelo compilador como registros, mas não são efetivamente... por isso só é possível fazer atribuições aos campos e não como registros inteiros. Trigger after: não é possível escrever em :old e :new Trigger before: não é possível escrever em :old

O que um trigger executa? Primeiramente, o corpo do trigger será executado 3 vezes para cada tipo de operação Os valores para cada execução considerando cada operação serão: old new INSERT NroUSP TipoVinc Nome DataIngresso DataNascimento Ativo NULL NroUSP TipoVinc Nome DataIngresso DataNascimento Ativo 21 2 João 05/09/2002 NULL y 22 1 Gilberto 09/05/2000 23 3 Alfredo 03/04/2002 UPDATE NroUSP TipoVinc Nome DataIngresso DataNascimento Ativo 21 2 João 05/09/2002 NULL y 22 1 Gilberto 09/05/2000 23 3 Alfredo 03/04/2002 NroUSP TipoVinc Nome DataIngresso DataNascimento Ativo 21 2 JOÃO 05/09/2002 NULL y 22 1 GILBERTO 09/05/2000 23 3 ALFREDO 03/04/2002 old e new são tratados pelo compilador como registros, mas não são efetivamente... por isso só é possível fazer atribuições aos campos e não como registros inteiros. Trigger after: não é possível escrever em :old e :new Trigger before: não é possível escrever em :old

O que um trigger executa? Primeiramente, o corpo do trigger será executado 3 vezes para cada tipo de operação Os valores para cada execução considerando cada operação serão: old new INSERT NroUSP TipoVinc Nome DataIngresso DataNascimento Ativo NULL NroUSP TipoVinc Nome DataIngresso DataNascimento Ativo 21 2 João 05/09/2002 NULL y 22 1 Gilberto 09/05/2000 23 3 Alfredo 03/04/2002 UPDATE NroUSP TipoVinc Nome DataIngresso DataNascimento Ativo 21 2 João 05/09/2002 NULL y 22 1 Gilberto 09/05/2000 23 3 Alfredo 03/04/2002 NroUSP TipoVinc Nome DataIngresso DataNascimento Ativo 21 2 JOÃO 05/09/2002 NULL y 22 1 GILBERTO 09/05/2000 23 3 ALFREDO 03/04/2002 old e new são tratados pelo compilador como registros, mas não são efetivamente... por isso só é possível fazer atribuições aos campos e não como registros inteiros. Trigger after: não é possível escrever em :old e :new Trigger before: não é possível escrever em :old DELETE NroUSP TipoVinc Nome DataIngresso DataNascimento Ativo 21 2 João 05/09/2002 NULL y 22 1 Gilberto 09/05/2000 23 3 Alfredo 03/04/2002 NroUSP TipoVinc Nome DataIngresso DataNascimento Ativo NULL

O que um trigger executa? Primeiramente, o corpo do trigger será executado 3 vezes para cada tipo de operação Os valores para cada execução considerando cada operação serão: old new INSERT NroUSP TipoVinc Nome DataIngresso DataNascimento Ativo NULL NroUSP TipoVinc Nome DataIngresso DataNascimento Ativo 21 2 João 05/09/2002 NULL y 22 1 Gilberto 09/05/2000 23 3 Alfredo 03/04/2002 Esta análise é válida tanto para BEFORE quanto para AFTER. UPDATE NroUSP TipoVinc Nome DataIngresso DataNascimento Ativo 21 2 João 05/09/2002 NULL y 22 1 Gilberto 09/05/2000 23 3 Alfredo 03/04/2002 NroUSP TipoVinc Nome DataIngresso DataNascimento Ativo 21 2 JOÃO 05/09/2002 NULL y 22 1 GILBERTO 09/05/2000 23 3 ALFREDO 03/04/2002 old e new são tratados pelo compilador como registros, mas não são efetivamente... por isso só é possível fazer atribuições aos campos e não como registros inteiros. Trigger after: não é possível escrever em :old e :new Trigger before: não é possível escrever em :old DELETE NroUSP TipoVinc Nome DataIngresso DataNascimento Ativo 21 2 João 05/09/2002 NULL y 22 1 Gilberto 09/05/2000 23 3 Alfredo 03/04/2002 NroUSP TipoVinc Nome DataIngresso DataNascimento Ativo NULL

Triggers Para que usar? restrições de consistência e validade que não possam ser implementadas com constraints – por exemplo, envolvendo múltiplas tabelas criar conteúdo de uma coluna derivado de outras atualizar tabelas em função da atualização de uma determinada tabela criar logs – segurança  auditoria ..... OBS: explorar trigger de DML e de sistema como recurso para auditoria de segurança