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

Documents pareils