EXEMPLOS TRIGGERS
2. Alterac¸a˜ o do sal´ario de um ou mais empregados
3. Mudanc¸a de empregados de um departamento para outro.
R2: CREATE TRIGGER TotalSal2
AFTER UPDATE OF Salario ON Empregado
FOR EACH ROW
WHEN (NEW.Ndep IS NOT NULL)
UPDATE Departamento
SET TotalSal=TotalSal+NEW.Salario-OLD.Salario
WHERE Dnum=NEW.Ndep;
R3: CREATE TRIGGER TotalSal3
AFTER UPDATE OF Ndep ON Empregado
FOR EACH ROW
BEGIN
UPDATE Departamento
SET TotalSal=TotalSal+NEW.Salario
WHERE Dnum=NEW.Ndep;
UPDATE Departamento
SET TotalSal=TotalSal-OLD.Salario
WHERE Dnum=OLD.Ndep;
END;
42
Exemplos de triggers (cont)
4. Remover um ou mais empregados.
R4: CREATE TRIGGER TotalSal4
AFTER DELETE ON Empregado
FOR EACH ROW
WHEN (OLD.Ndep IS NOT NULL)
UPDATE Departamento
SET TotalSal=TotalSal-OLD.Salario
WHERE Dnum=OLD.Ndep;
43
Triggers (cont.)
A execuc¸a˜ o da acc¸a˜ o pode ser condicionada:
– AFTER – a condic¸a˜ o WHEN e´ testada depois do evento-de-disparo.
– BEFORE – a condic¸a˜ o WHEN e´ testada antes do evento-de-disparo.
– INSTEAD OF – a acc¸a˜ o e´ executada se a condic¸a˜ o WHEN se verifica e o evento-de-disparo n˜ao e´ executado.
Eventos-de-disparo: UPDATE, INSERT, DELETE.
– especifica que a regra vai ser disparada uma vez por cada linha
(tuplo) afectada pelo evento-de-disparo.
FOR EACH ROW
CREATE TRIGGER nome_trigger
(AFTER|BEFORE) trigger-eventos ON nome-tabela
[FOR EACH ROW]
[WHEN condic
¸˜
ao] trigger-acc ¸˜ ao; <-- PL/SQL trigger-evento = INSERT|DELETE|UPDATE [OF atributos]
40
Exemplos de triggers
Suponha que temos as relac¸o˜ es:
Empregado(Nome, EBI, Salario, Ndep, SuperBI)
Departamento(Dnome, Dnum, TotalSal, DirBI)
TotalSal e´ um atributo derivado e manter o seu valor actualizado pode ser feito atrav´es de um trigger. Os eventos que podem determinar uma alterac¸ a˜ o do valor desse atributo s˜ao:
1. Inserir (um ou mais) novos empregados
R1: CREATE TRIGGER TotalSal1
AFTER INSERT ON Empregado
FOR EACH ROW
WHEN (NEW.Ndep IS NOT NULL)
UPDATE Departamento
SET