Sistema de informação
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 execucao da accao pode ser condicionada: ¸˜ ¸˜
´ – AFTER – a condicao WHEN e testada depois do evento-de-disparo. ¸˜ ´ – BEFORE – a condicao WHEN e testada antes do evento-de-disparo. ¸˜ – INSTEAD OF – a accao e executada se a condicao WHEN se verifica e o evento-de-disparo n˜ o ¸˜ ´ ¸˜ a ´ e executado.
Eventos-de-disparo: UPDATE, INSERT, DELETE.
FOR EACH ROW
– especifica que a regra vai ser disparada uma vez por cada linha (tuplo) afectada pelo evento-de-disparo.
CREATE TRIGGER nome_trigger (AFTER|BEFORE) trigger-eventos ON nome-tabela [FOR EACH ROW] [WHEN condicao] ¸˜ trigger-acc˜o; ¸a =ALL (SELECT SUM(Durac˜o) FROM Filme GROUP BY Est´dio); ¸a u
2- O sal´ rio de um empregado n˜ o pode ser maior do que o sal´ rio do director do departamento onde o empregado trabalha. a a a
CREATE ASSERTION TectoSalario CHECK (NOT EXISTS (SELECT * FROM Empregado E, Empregado S, Departamento D WHERE E.Salario>S.Salario AND E.Ndep=D.Dnum AND D.DirBI=S.EBI));
38
Triggers (gatilhos) em SQL3
Baseiam-se em regras do tipo evento-condic ao-accao (ECA) ¸˜ ¸˜ – O evento que faz disparar o trigger. S˜ o normalmente operacoes