L3 Info : SGBD
 
◃  Ch. 11 Oracle PL/SQL  ▹
 

Exemple de trigger

  • On dispose d'une relation employe(emp_id, emp_nom, emp_salaire, emp_manager, emp_embauche, emp_service) :
    create table employe(
      emp_id    number(4,0),
      emp_nom   varchar2(10),
      emp_job      varchar2(9),
      emp_manager      number(4,0),
      emp_embauche date,
      emp_salaire      number(7,2),
      emp_serv   number(2,0),
      constraint pk_employe primary key (emp_id),
      constraint fk_serv foreign key (emp_serv) references service (serv_id),
      constraint fk_mngr foreign key (emp_manager) references employe(emp_id)
    );
  • Pour mémoriser l'évolution salariale des employés, on crée une table trace_salaire(emp_id, old_sal, new_sal, date_sal, typeChgt) :
    CREATE TABLE trace_salaire (
        emp_id number(4,0),
        old_sal number(7,2),
        new_sal number(7,2),
        date_sal date,
        typeChgt VARCHAR(8) CHECK (typeChgt IN ('NOUVEAU', 'MODIFIE', 'SUPPRIME')),
        foreign key (emp_id) references employe
    );
  • La table trace_salaire est alimenté par un trigger dès que le contenur de la table employé change :;
    CREATE OR REPLACE TRIGGER trig_trace_salaire
    AFTER INSERT OR UPDATE OR DELETE ON emp
    FOR EACH ROW
    DECLARE
       quand DATE := SYSDATE;
    BEGIN
    IF INSERTING THEN
         INSERT INTO trace_salaire
           VALUES (:new.empno,null,:new.sal,quand,'NOUVEAU');
    ELSIF UPDATING('SAL') THEN
         INSERT INTO trace_salaire
           VALUES (:old.empno,:old.sal,:new.sal,quand,'MODIFIE');
    ELSIF DELETING THEN
         INSERT INTO trace_salaire
           VALUES (:old.empno,:old.sal,null,quand,'SUPPRIME');
    END IF;
    END;