Vous êtes sur la page 1sur 18

Les triggers PL/SQL

Abir GORRAB
abir.gorrab@sesame.com.tn
Introduction
Un trigger est un programme qui se déclenche
automatiquement suite à un évènement
En base de données, l’évènement est une instruction du LMD qui
modifie la base (INSERT, DELETE, UPDATE)

Ces triggers font partie du schéma de la base. Leur code compilé est
conservé.
Les triggers peuvent servir à vérifier des contraintes que l’on
ne peut pas définir de façon déclarative

Ils peuvent gérer de la redondance d’information.

Ils peuvent servir à collecter des informations sur les


mises-à-jour de la base
PL/SQL 2
Syntaxe

CREATE [ OR REPLACE ] TRIGGER <nom_trigger>

<instant [before|after]> <liste_evts [insert|update|delete] >

ON <nom_table> [ FOR EACH ROW ]

[ WHEN ( <condition> ) ]

<corps>

PL/SQL 3
Entête du trigger
On définit
La table
Les instructions qui déclenchent le trigger
Le moment où le trigger va se déclencher par rapport à
l’instruction (avant ou après)
Si le trigger se déclenche
une seule fois pour toute l’instruction
ou une fois pour chaque lignemodifiée/insérée/supprimée
Et éventuellement une condition supplémentaire de
déclenchement (clause WHEN) pour les triggersligne.

PL/SQL 4
Conditions d’un trigger
Le trigger se déclenche lorsqu’un événement précis
survient :BEFORE UPDATE,AFTER DELETE,
AFTER INSERT,…

Ces événements sont importants car ils définissent le


moment d’exécution du trigger.

Ainsi, lorsqu’un trigger BEFORE INSERT est programmé, il


sera exécuté juste avant l’insertion d’un nouvel élément dans la
table.

PL/SQL 5
Conditions d’un trigger
Si le trigger doit déterminer si l’instruction est autorisée : utiliser
BEFORE
Si le trigger doit ”fabriquer” la valeur d’une colonne pour pouvoir
ensuite la mettre dans la table :utiliser BEFORE.
Par exemple :trigger ligne qui fabrique la valeur de clé
primaire à partir d’uneséquence.
Si on a besoin que l’instruction soit terminée pour
exécuter le corps du trigger :utiliser AFTER

PL/SQL 6
Trigger table

CREATE [ OR REPLACE ] TRIGGER <nom_trigger>

<instant [before|after]> <liste_evts [insert|update|delete] >

<corps>

PL/SQL 7
Les types de triggers

Il existe deux types de triggers différents : les triggers de table


(STATEMENT) et les triggers de ligne (ROW).

Les triggers de table sont exécutés une seule fois lorsque des
modifications surviennent sur une table (même si ces
modifications concernent plusieurs lignes de latable).

Ils sont utiles si des opérations de groupe doivent être réalisées


(comme le calcul d’une moyenne, d’unesomme totale,…).

PL/SQL 8
Trigger table
Exemple
CREATE TRIGGER log
AFTER INSERT OR UPDATE ON Emp_tab
BEGIN
INSERT INTO log(table, date, action) VALUES ('Emp_tab',
sysdate, 'INSERT/UPDATE on Emp_tab') ;
END ;

Ce trigger table enregistre dans une table log la trace de la


modification de la table Emp_tab.
On mémorise ici le moment de la modification
Il n’est donc exécuté qu’une seule fois par modification de la table
Emp_tab.

PL/SQL 9
Trigger ligne

CREATE [ OR REPLACE ] TRIGGER <nom_trigger>

<instant [before|after]> <liste_evts [insert|update|delete] >

ON <nom_table>

FOR EACH ROW

[ WHEN ( <condition> ) ]

<corps>

PL/SQL 10
Trigger ligne
Les triggers lignes sont exécutés « séparément » pour chaque
ligne modifiée dans la table.

Ils sont très utiles s’il faut mesurer une évolution pour certaines
valeurs, effectuer des opérations pour chaque ligne en question.

Lors de la création de triggers lignes, il est possible d’avoir accès à la


valeur ancienne et la valeur nouvelle grâce aux mots clés OLD et
NEW.
Il faut préfixer ces qualificatifs de deux points (:) dans tout
ordre SQL ou PL/SQL les utilisant.
Il ne faut pas utiliser de préfixe deux points (:) quand les qualificatifs sont
utilisés dans la condition de restriction WHEN

Il n’est pas possible d’avoir accès à ces valeurs dans les triggers
de table.
PL/SQL 11
Trigger ligne

:OLD et :NEW et la clause WHEN


Table emp(num, nom, sal)
.

CREATE TRIGGER modifsalaire


BEFORE UPDATE OF sal ON emp
FOR EACH ROW
WHEN (new.sal < old.sal)
-- seulement dans la
clause when, OLD et
NEW ne doivent pas être
précédés par:
BEGIN
raise_application_error(-20001,
'Interdit de baisser le salaire ! ('|| :old.nom || ')');
END;

PL/SQL 12
Trigger ligne
CREATE TRIGGER Print_salary_changes
BEFORE UPDATE
ON Emp_tab
FOR EACH ROW
WHEN (new.Empno > 0)
DECLARE sal_diff number;
BEGIN
sal_diff := :new.sal - :old.sal;
dbms_output.put_line(' Old : ' || :old.sal || 'New : ' || :new.sal || 'Difference : ' ||
sal_diff);
END ;

Ce trigger est déclenché lorsque latableEmp_tab est mise à jour.


Pour chaque modification (lignes mises à jour), le trigger va calculer puis afficher
respectivement l’ancien salaire, le nouveau salaire et la différence entre ces deux
salaires.
La condition précisée (WHEN new.Empno > 0) restreintle
déclenchement du trigger (exécuté uniquement si new.Empno > 0)

PL/SQL 13
Les types de trigger
Trigger de table :
Le trigger est exécuté une fois pour l’ensemble de l’instruction
pas de notion de ligne courante.
Trigger ligne :
notion de ligne courante, :old désigne la ligne avant
modification et :new désigne la ligne après modification.

:old :new
Insert null Valeur insérée
Delete Valeur supprimée Null
Update Valeur avant modification Valeur après modification

PL/SQL 14
Ordre d’exécution des triggers

Pour une instruction du LMD sur une table de la base, il peut y


avoir 4 sortes de triggers possibles selon l’instant (before, after)
et le type (table(instruction) ou ligne).
Table employe
Ces triggers se déclenchent dans l’ordre suivant :
Trigger(s) table BEFORE
Pour chaque ligne concernée
Trigger(s) ligne BEFORE
Trigger(s) ligneAFTER
Trigger(s) tableAFTER

PL/SQL 15
Activation / Désactivation des triggers
Lorsqu’un trigger est créé, il est automatiquement activé
Désactiver un trigger :
ALTERTRIGGER trigger_name DISABLE
Activer un trigger :
ALTERTRIGGER trigger_name ENABLE
Activer ou désactiver tous les triggers d’une table :
ALTER TABLE table_name DISABLE |[ENABLE]ALL
TRIGGERS

PL/SQL 16
Remarques
Recompiler un trigger:
ALTER TRIGGER trigger_nameCOMPILE
le trigger est recompilé sans perdre sa validité (actif) ou son
invalidité(non actif).
Afficher les erreurs de compilation :
SHOW ERRORS
Supprimer un trigger :
DROP TRIGGER nomTrigger

PL/SQL 17
Remarques
Nom des triggers et leurs propriétaires
SELECT owner, object_name
FROM all_objects
WHERE object_type = ‘TRIGGER'
ORDER BY owner, object_name;

PL/SQL 18

Vous aimerez peut-être aussi