1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.
Dismiss Notice
Welcome to our Education website, plz like our page facebook to support us. Thank You and wish you good navigation

Les déclencheurs : Triggers

abdelouafiOct 18, 2016

    1. abdelouafi

      abdelouafi Administrator Staff Member

      Messages:
      181
      Likes Received:
      9
      Trophy Points:
      18
      Joined
      Sep 13, 2016
      Les déclencheurs : Triggers

      Déclencheur ligne « row trigger »
       Déclencheur s'exécute pour chaque ligne
       Accès aux anciennes et aux nouvelles valeurs
      - :OLD.colonne ancienne valeur
      - :NEW.colonne nouvelle valeur

      - OLD permet de connaître la ligne en cours de suppression dans un trigger DELETE ou la ligne avant modification dans un trigger UPDATE.
      - NEW permet de connaître la nouvelle ligne insérée dans un trigger INSERT ou la ligne après modification dans un trigger UPDATE
      Exemple d’un déclencheur ligne : Mise à jour automatique du nombre du vol
      1. Ajouter le champ Nbrevol à la table Pilote initialisé à 0 puis afficher ses lignes .
      2. Créer le déclencheur INSERT_VOL.
      3. Insérer un vol puis afficher les lignes la table pilote.

      alter table pilote ADD (nbrevol integer default 0);
      CREATE OR REPLACE TRIGGER INSERT_VOL AFTER INSERT ON Vol FOR EACH ROW BEGIN UPDATE Pilote SET Nbrevol = Nbrevol + 1 WHERE npilote = :NEW.npilote; END INSERT_VOL; /

      insert into vol values (92,2,2,'Rak','Fes','0815','1020',SYSDATE);

      Exemple d’un déclencheur ligne : Un pilote ne doit pas effectuer 2 vols par jour.
      CREATE OR REPLACE TRIGGER Nombre_Vol BEFORE INSERT ON Vol FOR EACH ROW DECLARE Nbre Number; BEGIN select Count(*) into Nbre from Vol WHERE npilote = :NEW.npilote AND DateV='03/03/89'; If Nbre>=1 then RAISE_APPLICATION_ERROR(-20101, 'Le pilote numéro ' || :NEW.npilote || ' a déjà un vol' ); End if; END; /

      insert into vol values (95,1,2,'Rak','Fes','0815','1020','03/03/89'); Commit;


      ERREUR à la ligne 1 : ORA-20101: Le pilote numéro 1 a déjà un vol ORA-04088: erreur lors d'exécution du déclencheur 'NOMBRE_VOL'

      Regroupement d’événements
       On peut programmer des conditions
       Cas d’une insertion IF INSERTING THEN …
       Cas d’une mise à jour IF UPDATING(‘colonne ’) THEN …
       Cas d’une suppression IF DELETING THEN …
       Regroupement possible dans un seul déclencheur


      CREATE OR REPLACE TRIGGER REG_EVENEMENT AFTER INSERT OR DELETE ON Vol REFERENCING OLD AS LigneAvant NEW AS LigneApres FOR EACH ROW BEGIN IF INSERTING THEN UPDATE Pilote SET Nbrevol = Nbrevol + 1 WHERE npilote = :LigneApres.npilote; END IF; IF DELETING THEN UPDATE Pilote SET Nbrevol = Nbrevol - 1 WHERE npilote = :LigneAvant.npilote; END IF; END REG_EVENEMENT; /

      insert into vol values (92,2,2,'Rak','Fes','0815','1020',SYSDATE); delete from vol Where nvol=92 and npilote=2;

      Principe :
       Raisonnement global sur la table
       Pas sur un enregistrement particulier

      Exemple : Ne permet pas la modification du numéro de pilote et de l’avion dans la table Vol.
      CREATE OR REPLACE TRIGGER Exemple_Statement BEFORE UPDATE OF Npilote, Navion ON Vol BEGIN RAISE_APPLICATION_ERROR(-20102, 'Cette modification est interdite dans la table vol'); END Exemple_Statement; /

      SQL> update vol set npilote=9 where nvol=100;

      Suppression
      DROP TRIGGER NomDéclencheur ;

      Désactivation
      ALTER TRIGGER NomDéclencheur DISABLE ;

      Réactivation
      ALTER TRIGGER NomDéclencheur ENABLE ;

      Désactivation/réactivation de tous les déclencheurs d ’une table

      ALTER TABLE NomTable { ENABLE | DISABLE } ALL TRIGGERS ;

      Principe  Déclencheur dont le corps s'exécute « à la place de » l’événement déclenchant  Uniquement dans le cadre de déclencheur ligne  Le déclencheur INSTEAD OF permet l’insertion, la modification et la suppression de lignes à travers une vue basée sur plusieurs tables qui pourrait être autrement non modifiable car la vue est le résultat d’une jointure.

      Syntaxe
      CREATE [OR REPLACE] TRIGGER nomtrigger INSTEAD OF {DELETE|INSERT|UPDATE [OF colonne1 ,…]} ON NomVue FOR EACH ROW [DECLARE] -- déclaration de variables BEGIN -- instruction SQL et PL/SQL END [nomtrigger]; /
       

      Attached Files:

      Last edited: Dec 14, 2016
      Loading...

Share This Page

Share