Vous êtes sur la page 1sur 7

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
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
2013-2014 N.EL FADDOULI
68

Utilité

 Utilité :
o Maintien de contraintes d’intégrité.

o Propagation des MAJ dans une base de données distribuée.

o Sécurité
o .....

2013-2014 N.EL FADDOULI


69

Page 2
Structure d’un trigger
CREATE [ OR REPLACE ] TRIGGER nom_trigger
{BEFORE | AFTER | INSTEAD OF}
OF} // événement
{INSERT | DELETE | UPDATE [OF liste de colonnes ] }
ON table
bl
[ 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. 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.
2. Deux types de triggers peuvent être définis:
1. Trigger d’énoncé : C’est un trigger lancé une seule fois.
2. Tigger de tuple:
tuple: trigger exécuté autant de fois qu’il ya de tuples à insérer, à modifier ou à
supprimer
3. Par défaut un trigger est actif, il peut cependant être désactivé:
ALTER TRIGGER nom_trigger DISABLE ;
ALTER TRIGGER nom_trigger ENABLE ;
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
INSERT INTO Journal VALUES (:old
old.codprod
.codprod,, ::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 )


Codprod Prix ....
BEGIN
Ligne avant (OLD) 10 11
:New.Prix := :Old.Prix * 1.1 ;
Codprod Prix ....
END; Ligne après (NEW) 10 15.99
/
Codprod Prix ....
Ligne après (NEW) 10 12.1

2013-2014 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 mot-
mot-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

Vous aimerez peut-être aussi