Académique Documents
Professionnel Documents
Culture Documents
Procedural Language/SQL
(Chapitre 5)
PL/SQL 2
2023-2024
Les triggers
Un déclencheur ou trigger est un traitement déclenché suite à un
événement.
Par exemple, un déclencheur peut être défini pour vérifier, lors de chaque
affectation d’un avion à un vol, que l’avion n’est pas déjà requis pour une
autre affectation pendant la durée de vol.
2013-2014 3
Les triggers
Un triggers de BD est associé à une et une seule table, il est
opérationnel jusqu’à la suppression de la table à laquelle il est
lié.
Le traitement associé au trigger peut être exécuté:
Soit une fois: suite à l’événement qui l’a déclenché (trigger par
ordre)
Soit pour chaque ligne de la table concernée par l’événement
(trigger ligne).
Mais comment peut-on déclencher un trigger BD ?
L’événement déclencheur est une action de mise à jour sur
la table (INSERT, DELETE, UPDATE).
A la différence d’une procédure stockée, on ne peut pas
appeler un trigger explicitement.
2013-2014 4
Les triggers
Syntaxe
CREATE [OR REPLACE] TRIGGER <nom_trigger>
<instant> <liste_evts>
ON <nom_table> [FOR EACH ROW]
[WHEN ( <condition> ) ]
<corps>
On définit:
La table
Les instructions du DML qui déclenchent le trigger
Le moment où le trigger va se déclencher par rapport à
l’instruction DML (avant ou après)
Si le trigger se déclenche:
Une seule fois pour toute l’instruction (i.e trigger
instruction),
Ou une fois pour chaque ligne
modifiée/insérée/supprimée (i.e trigger ligne, avec
l’option FOR EACH ROW).
Et éventuellement une condition supplémentaire de
déclenchement (clause WHEN)
2013-2014 6
Les triggers
AFTER ou BEFORE ?
Si le trigger doit déterminer si l’instruction DML est autorisée :
utiliser BEFORE
2013-2014 7
Les triggers
AFTER ou BEFORE ?
Un trigger ligne avec l’option BEFORE peut servir à
effectuer des traitements d’initialisation avant exécution
des modifications sur la table.
2013-2014 8
Les triggers
Trigger ligne ou instruction ?
1. Trigger ligne
notion de ligne courante, :old désigne la ligne avant modif
et :new désigne la ligne après modif.
:old :new
insert null valeur insérée
delete valeur supprimée null
update valeur avant modif valeur après modif
2. Trigger instruction
Le trigger est exécuté une fois pour l’ensemble de
l’instruction ! pas de notion de ligne courante
2013-2014 9
Les triggers
Exemple de trigger instruction
2013-2014 10
Les triggers
Exemple de trigger ligne
2013-2014 11
Les triggers
Clause WHEN
On peut définir une condition pour un trigger ligne :
le trigger se déclenchera pour chaque ligne vérifiant la condition.
2013-2014 12
Les triggers
Clause WHEN
EMP_LOG
emp_id date_evt msg
Corps du trigger
Bloc PL/SQL
Prédicat INSERTING (resp. UPDATING, DELETING) qui
vaut vrai ssi le trigger a été déclenché par un INSERT (resp
UPDATE, DELETE)
Exemple : IF UPDATING (‘nom_colonne’) THEN
traitements END IF;
pseudo-tuples :new et :old pour les triggers lignes
Il ne faut pas, dans un trigger ligne, interroger une table
qui est en cours de modification (pb mutating table).
2013-2014 14
Les triggers
Exemple 1
Voici un exemple de trigger qui maintient la capacité d’un cinéma
après chaque modification de la table Salle.
2013-2014 15
Les triggers
Exemple 2
Pour garantir la validité du cumul, il faudrait créer des triggers
sur les événements UPDATE, DELETE et INSERT.
Une solution plus concise est de recalculer systématiquement le
cumul : dans ce cas on peut utiliser un trigger qui se déclenche
globalement pour la requête :
PL/SQL 19
2023-2024
Exemple
PL/SQL 20
2023-2024
Déclencheur par ligne
2023-2024
Exemple trigger par ligne
USER_TRIGGERS
ALL_TRIGGERS
DBA_TRIGGERS
PL/SQL 23
2023-2024
Suppression
PL/SQL 24
2023-2024
Activation/Désactivation
PL/SQL 25
2023-2024
Restrictions
PL/SQL 26
2023-2024
Restrictions (suite)
PL/SQL 27
2023-2024
Restrictions : exemple
CREATE OR REPLACE TRIGGER verifDate
AFTER UPDATE OF dateEnvoi OR INSERT ON location
FOR EACH ROW
DECLARE
delaiMax NUMBER(6);
BEGIN
SELECT MAX(dateEnvoi – dateLocation) INTO delaiMax
FROM location;
IF :NEW.dateEnvoi – :NEW.dateLocation > delaiMax THEN
RAISE_APPLICATION_ERROR (-20002, 'Envoi '||
:NEW.numExemplaire||' hors limites');
END IF;
END verifDate;
PL/SQL 28
2023-2024
Restrictions : exemple (suite)
Exécution :
INSERT INTO location VALUES (2908, SYSDATE,
'mo', SYSDATE, null)
Erreur commençant à la ligne: 1 de la commande -
INSERT INTO location VALUES (…)
Rapport d'erreur -
Erreur SQL : ORA-04091: la table
FFIOREN.LOCATION est en mutation ; le
déclencheur ou la fonction ne peut la voir
PL/SQL 29
2023-2024
Exemple
CREATE OR REPLACE TRIGGER verifDate
AFTER UPDATE OF dateEnvoi OR INSERT ON
location
FOR EACH ROW
DECLARE
delaiMax NUMBER(6) : = 45;
BEGIN
IF :NEW.dateEnvoi – :NEW.dateLocation > delaiMax
THEN RAISE_APPLICATION_ERROR (-20002, 'Envoi '||
:NEW.numExemplaire||' hors limites'); END IF;
END verifDate;
PL/SQL 30
2023-2024
Création de trigger dans ORACLE
PL/SQL 31
2023-2024
Création de trigger dans ORACLE 2
PL/SQL 32
2023-2024
Création de trigger dans ORACLE 3
PL/SQL 33
2023-2024
Création de trigger dans ORACLE 3
PL/SQL 34
2023-2024
Références
https://www.oracletutorial.com/plsql-tutorial/oracle-trigger/
https://www.tutorialspoint.com/plsql/plsql_triggers.htm
PL/SQL 35
2023-2024