Sie sind auf Seite 1von 6

Déclencheurs++

(Triggers)+

© O.Lamouchi+ 51+

Déclencheurs+(Triggers)+
!  !Déclencheur!:!!
Ac-on!ou!ensemble!d'ac-ons!déclenchée(s)!automa-quement!lorsqu'une!condi-on!
se!trouve!sa-sfaite!après!l'appari-on!d'un!événement.!
Il!peut!servir!à!:!!
•  ajouter!des!contraintes!sur!les!valeurs!des!aBributs!d’une!table,!!
•  enregistrer!des!changements!(suivi)!!
•  ajouter!des!règles!de!ges-on,...!!
!  !Un!déclencheur!est!une!règle!ECA!
•  Evénement!=! !mise!à!jour!d'une!rela-on!
•  Condi-on!!!!=! !op-onnelle,!équivaut!à!une!clause!<WHERE>!
•  Ac-on!!!!!!!!!!=! !exécu-on!de!code!spécifique!(requête!SQL!de!mise!à!jour,!
exécu-on!d'une!procédure!stockée,!abandon!d'une!transac-on,!...)!
!  De!mul-ples!usages!sont!possibles!:!
•  contrôle!de!l'intégrité!
•  main-en!de!sta-s-ques!
•  mise!à!jour!de!copies!mul-ples,!...!
+ © O.Lamouchi+ 52+
Déclencheurs+(Triggers)+
!  Un!déclencheur!peut!être!!déclenché!:!
!
•  à!la!créa-on,!suppression!ou!modifica-on!d’un!objet!!
!(CREATE,!DROP,!ALTER),!
•  à!la!connexion,!déconnexion!d’un!u-lisateur,!!
•  démarrage!ou!arrêt!d’une!instance...!!

!  L’ac-on!associée!à!un!déclencheur!est!un!bloc!PL/SQL!enregistré!dans!la!base.!
!
!  Un!déclencheur!est!opéra-onnel!jusqu’!à!la!suppression!de!la!table!à!laquelle!il!est!
lié.!

© O.Lamouchi+ 53+

Déclencheurs+(Triggers)+
"  Créa4on:++
CREATE![OR!REPLACE]!TRIGGER!nomTrigger))
{!BEFORE!|!AFTER!I!NSTEAD!OF!}!listeEvenement))
ON!nomTable)
![FOR!EACH!ROW]!!
[!WHEN!condi3on]!
)corpsTrigger))
)
•  listeEvenement!:!liste!d’événements!séparés!par!une!virgule!(!DELETE!ORINSERT!OR!
UPDATE).!
Si!UPDATE!on!peut!préciser!les!aBributs!concernés!(UPDATE!OF!listeABributs).!!

•  FOR!EACH!ROW!→!trigger!de!niveau!ligne,!sinon!de!niveau!table.!!
•  WHEN!condi-on!:!pour!chaque!ligne,!trigger!déclenché!si!vraie.!!
© O.Lamouchi+ 54+

)
Déclencheurs+(Triggers)+
"  Créa4on:+(suite)(
CREATE![OR!REPLACE]!TRIGGER!nomTrigger))
{!BEFORE!|!AFTER!|!INSTEAD!OF}!listeEvenement))
ON!nomTable)
![FOR!EACH!ROW]!!
[!WHEN!condi3on]!
)corpsTrigger))
)
•  corpsTrigger!:!bloc!PL/SQL!effectué!quand!le!trigger!est!déclenché.!!
•  En!plus!:!
IF!INSERTING!THEN!...!END!IF;!
IF!DELETING!THEN!...!END!IF;!!
IF!UPDATING!THEN!...!END!IF;!!
© O.Lamouchi+ 55+
)

Déclencheurs+(Triggers)+
"  Valeurs+des+a=ributs(

Dans!la!clause!WHERE!ou!dans!le!corps,!on!peut!se!référer!à!la!valeur!d’un!aBribut!avant!
ou!après!que!soit!effectuée!la!modifica-on!déclenchant!le!trigger!:!!

•  :OLD.nomABribut!:!la!valeur!avant!la!transac-on!UPDATE!ou!DELETE!!

•  :NEW.nomABribut!:!la!valeur!après!la!transac-on!UPDATE!ou!INSERT!!

© O.Lamouchi+ 56+
Déclencheurs+(Triggers)+
"  Exemple(1(

Afficher!le!numéro!et!le!nom!du!client!qu’on!veut!supprimer!de!la!table!client.!

((
CREATE!OR!REPLACE!TRIGGER!TRG_clt!
BEFORE!DELETE!ii!avant!supression!
!ON!client!!!!!!!!ii!sur!la!table!EMP!
!FOR!EACH!ROW!!ii!pour!chaque!ligne!!!
!Begin!!!
!!!!!!!dbms_output.put_line(!'Suppression!du!client!n°!'!||!!
To_char(!:OLD.numclient!)!||!'!i>!'!||!:OLD.nom!||!:OLD.prenom!)!;!
End!;!
!

© O.Lamouchi+ 57+

Déclencheurs+(Triggers)+
"  Exemple(2(
((

:! :!

© O.Lamouchi+ 58+
Déclencheurs+(Triggers)+
"  Exemple(3(
((

:!

© O.Lamouchi+ 59+

Déclencheurs+(Triggers)+
"  Exemple(4(
((

© O.Lamouchi+ 60+
Déclencheurs+(Triggers)+
"  Maintenances+des+Triggers:+
#  Ac4va4on/désac4va4on+d'un+déclencheur.+
+
K+Il!est!possible!de!désac-ver!un!déclencheur!:!!
!
+ALTER+TRIGGER+nom_déclencheur+DISABLE!
!
i!et!de!l'ac-ver!avec!la!commande!suivante!
!

+ALTER+TRIGGER+nom_déclencheur+ENABLE!
!
i!on!peut!désac-ver!tous!les!déclencheurs!définis!sur!une!table!!
!

+ALTER+TABLE+nom_table+DISABLE+ALL+TRIGGERS!
!
i!et!de!les!ac-ver!avec!la!commande!suivante!
!

+ALTER+TABLE+nom_table+ENABLE+ALL+TRIGGERS!
© O.Lamouchi+ 61+
!
!
!
!

Déclencheurs+(Triggers)+
"  Maintenances+des+Triggers:+

#  Les!informa-ons!sur!les!déclencheurs!sont!visibles!à!travers!les!vues!du!dic-onnaire!
de!données:!
!
i!USER_TRIGGERS!pour!les!déclencheurs!appartenant!au!schéma!
i!ALL_TRIGGERS!pour!les!déclencheurs!appartenant!aux!schémas!accessibles!
i!DBA_TRIGGERS!pour!les!déclencheurs!appartenant!à!tous!les!schémas!!
!
i!La!colonne!BASE_OBJECT_TYPE!permet!de!savoir!si!le!déclencheur!est!basé!sur!une!
table,!une!vue,!un!schéma!ou!la!totalité!de!la!base!!
!
i! La! colonne! TRIGGER_TYPE! permet! de! savoir! s'il! s'agit! d'un! déclencheur! BEFORE,!
AFTER!ou!INSTEAD!OF!
si!son!mode!est!FOR!EACH!ROW!ou!non!
s'il!s'agit!d'un!déclencheur!évènemen-el!ou!non!!
!
i!La!colonne!TRIGGERING_EVENT!permet!de!connaître!l'évèvement!concerné!par!le!
déclencheur!!
!
© O.Lamouchi+ 62+
i!La!colonne!TRIGGER_BODY!con-ent!le!code!du!bloc!PL/SQL!!