PL /SQL Triggers ( déclencheurs )
Transcription
PL /SQL Triggers ( déclencheurs )
PL /SQL Introduction Bloc PL/SQL Déclaration des variable Structure de contrôle Curseurs Les exceptions p Les fonctions et procédures Les packages Les triggers 2013-2014 N.EL FADDOULI 1 Triggers ( déclencheurs ) Définition Utilité Structure d’un trigger Exemples 2013-2014 N.EL FADDOULI 67 Page 1 Définition Déclencheur:: Déclencheur o Action ou ensemble d’actions déclenchée(s) automatiquement lorsq ’une lorsqu ne condition se trouve tro e satisfaite après l’apparition l apparition d d’un n événement.. événement Un déclencheur est une règle ECA o Evénement = mise à jour, suppression, insertion o Condition = expression logique vraie ou fausse, optionnelle o Action = p procédure exécutée lorsque q la condition est vérifiée vérifiée.. Exemples:: Exemples 2013-2014 o Avec ORACLE, les événements sont prédéfinies et les conditions et les actions sont spécifiées par le langage procédural PL/SQL. PL/SQL. o Avec DB DB22, le langage est le C N.EL FADDOULI 68 Utilité Utilité : 2013-2014 o Maintien de contraintes d’intégrité. o Propagation des MAJ dans une base de données distribuée. o Sécurité o ..... N.EL FADDOULI 69 Page 2 Structure d’un trigger CREATE [ OR REPLACE ] TRIGGER nom_trigger // événement {INSERT | DELETE | UPDATE [OF liste de colonnes ] } ON table bl {BEFORE | AFTER | INSTEAD OF} OF} [ FOR EACH ROW ] [ WHEN (condition de déclenchement) ] // condition DECLARE …… BEGIN ....... //Actions avec les données EXCEPTION ………………. END ; / 2013-2014 N.EL FADDOULI 70 Structure d’un trigger Exemple:: Suppression d’un client Exemple On supprime toutes ses commandes CREATE TRIGGER suppclient BEFORE DELETE ON CLIENT FOR EACH ROW BEGIN DELETE FROM COMMANDE WHERE Codcli= :OLD.Codcli END;; END / 2013-2014 N.EL FADDOULI 71 Page 3 Structure d’un trigger Une structure de trigger est composée de trois parties: Un événement déclencheur E: action externe sur une table ou sur un tuple qui déclenche le trigger. Une condition de déclenchement C: C’est une expression booléenne Une action du trigger A : c’est une procédure PL/SQL Remarques : 1. 2. Lorsqu’un trigger est lancé sur le serveur et qui se termine sans traitement d’exception, l’événement qui l’a déclenché se poursuit correctement. Deux types de triggers peuvent être définis: 1. 2. Trigger d’énoncé : C’est un trigger lancé une seule fois. Tigger de tuple: tuple: trigger exécuté autant de fois qu’il ya de tuples à insérer, à modifier ou à supprimer Par défaut un trigger est actif, il peut cependant être désactivé: ALTER TRIGGER nom_trigger DISABLE ; ALTER TRIGGER nom_trigger ENABLE ; 3. 2013-2014 N.EL FADDOULI 72 Structure d’un trigger Remarques : 1. Dans les triggers de tuples (FOR EACH ROW), ROW), on peut manipuler les valeurs traitées, directement en mémoire: mémoire: : old old.attribut .attribut : ancienne valeur ( DELETE | UPDATE ) : new new.attribut .attribut : nouvelle valeur ( INSERT | UPDATE ) Exemple: Trigger pour suppression et sauvegarde dans une table de journal Exemple: CREATE OR REPLACE TRIGGER suppression_ligne BEFORE DELETE ON produit FOR EACH ROW BEGIN old.codprod .codprod,, INSERT INTO Journal VALUES (:old ::old old.libelle .libelle,, :old old.prix .prix,, :old.qte) :old .qte) ; END; 2013-2014 N.EL FADDOULI 73 Page 4 Exemple 1: Lorsqu'une augmentation du prix Unitaire ( PU )d'un Produit est tentée, il faut limiter l'augmentation à 10% du prix en cours CREATE OR REPLACE TRIGGER BORNER_AUGMENTPU BEFORE UPDATE OF Prix UPDATE PRODUIT ON PRODUIT SET Prix = 15.99 FOR EACH ROW WHERE Codprod=10; When (New.Prix > Old.Prix * 1.1 ) BEGIN Codprod Prix Ligne avant (OLD) 10 11 Codprod Prix Ligne après (NEW) 10 15.99 :New.Prix := :Old.Prix * 1.1 ; END; .... .... / Ligne après (NEW) 2013-2014 Codprod Prix 10 12.1 .... N.EL FADDOULI 74 Exemple22: Utilisation d'un TRIGGER pour le maintien d'une Exemple contrainte d'intégrité dynamique Empêcher une augmentation du PU d'un produit au delà de 10% du prix en cours CREATE OR REPLACE TRIGGER BORNER BORNER_AUGMENTPU AUGMENTPU BEFORE UPDATE OF Prix ON PRODUIT FOR EACH ROW When (New.Prix > Old.Prix * 1.1 ) BEGIN RAISE_APPLICATION_ERROR ( -20999, 'Violation de la Contrainte ') ; END; / 2013-2014 N.EL FADDOULI 75 Page 5 Exemple3 : Utilisation d'un TRIGGER pour le maintien d'une contrainte d'intégrité statique 0 < codcli < 10000 CREATE OR REPLACE TRIGGER VERIFIERNOCLIENT BEFORE INSERT OR UPDATE OF Codcli ON CLIENT FOR EACH ROW WHEN ( New.Codcli<=0 ) OR ( New.Codcli>=10000 ) BEGIN RAISE_APPLICATION_ERROR ( -20009, ' Numéro du client incorrect ' ) ; END; N.B: CHECK est préférable ! 2013-2014 N.EL FADDOULI 76 Exemple 4 Lors d'un achat, la quantité à commandé d'un produit ne peut pas dépasser la quantité en stock disponible CREATE OR REPLACE TRIGGER VERIFIERSTOCK BEFORE INSERT ON Detail FOR EACH ROW DECLARE S Produit.Qte Produit.Qte%type; %type; BEGIN SELCT Qte INTO S FROM produit WHERE codprod codprod= =:New.codprod New.codprod;; If ( :New New.Qtecom .Qtecom> Qtecom> Qtecom > S) Then RAISE_APPLICATION_ERROR ( -20009, ' Quantité demandée non disponible') ; End if; END; / 2013-2014 N.EL FADDOULI 77 Page 6 Extension procédurale pour corpsTrigger Traitements complexes Combiner C bi plusieurs l i TRIGGER vérifier quel est l ’événement déclencheur Ordre d ’exécution des TRIGGER BEFORE avant AFTER,... entre TRIGGER de même type ? f forcer un ordre d en combinant bi Oracle PL/SQL 2013-2014 N.EL FADDOULI 78 Particularités des TRIGGER Oracle Pas de SELECT dans le WHEN :NEW,, :OLD Omettre le motmot-clé ROW dans REFERENCING Corps en PL/SQL Syntaxte :nomColonne Pas de COMMIT/ROLLBACK dans un TRIGGER procédure PL/SQL RAISE_APPLICATION_ERROR IF INSERTING, DELETING, UPDATING. É Événements non standards INSTEAD OF, STARTUP, LOGON, ... Problème avec table en mutation (modifée par l'événement déclencheur) etc. 2013-2014 N.EL FADDOULI 79 Page 7