Vous êtes sur la page 1sur 35

Cours : PL/SQL

Procedural Language/SQL
(Chapitre 5)

Présenté par Hichem Mrabet


A.U. 2023/2024
Plan
1. Introduction
2. Les triggers
3. Syntaxe d’un trigger
4. Entête d’un trigger/ corps d’un trigger
5. Les types d’un trigger:
 Trigger ligne
 Trigger instruction
 Trigger INSTEAD OF

PL/SQL 2

2023-2024
Les triggers
 Un déclencheur ou trigger est un traitement déclenché suite à un
événement.

 Les triggers peuvent être applicatifs ou de base de données.

 Nous ne nous intéresserons qu’aux déclencheurs de BD.

 Pourquoi Les déclencheurs ?


 Ils peuvent servir à vérifier des contraintes que l’on ne peut pas définir de
façon déclarative
 Ils permettent d’implémenter des règles de gestion complexes
 Ils peuvent aussi servir à collecter des informations sur les mises-à-jour de la
BD.
 Audit des données sensibles.

 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>

<instant> ::= AFTER | BEFORE


<liste_evts> ::= <evt> {OR <evt>}
<evt> ::= DELETE | INSERT | UPDATE [OF {<liste_cols> }]
<liste_col> ::= <nom_col> { , <nom_col> }
<corps> corps de programme PL/SQL
2013-2014 5
Entête du trigger

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

 Si le trigger doit "fabriquer" la valeur d’une colonne pour pouvoir


ensuite la mettre dans la table : utiliser BEFORE

 Si on a besoin que l’instruction DML soit terminée pour exécuter


le corps du trigger : utiliser AFTER

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.

 Un trigger ligne avec l’option AFTER permet de propager


les modifications ou de gérer des historiques. Il est souvent
utilisé avec référence aux anciennes valeurs et/ou aux
nouvelles valeurs des colonnes

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.

 Create or replace trigger journal_emp


after update of salary on EMPLOYEE
for each row
when (:new.salary < :old.salary)
begin
insert into EMP_LOG(emp_id, date_evt, msg)
values (:new.empno, sysdate, ’salaire diminué’);
end ;

2013-2014 12
Les triggers
Clause WHEN

EMP update Emp EMP


Empno … Salary set salary = 5000 Empno … Salary
1 10000 where salary < 10000 ; 1 10000
2 4000 2 4000
3 6000 3 6000
4 8000 4 8000
3 lignes modifiées

EMP_LOG
emp_id date_evt msg

Le trigger se 3 25/11/23 ’salaire diminué’


déclenche 2 fois 4 25/11/ ’salaire diminué’
2013-2014 13
Les triggers

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.

CREATE TRIGGER CumulCapacite


AFTER UPDATE OF capacite ON Salle
FOR EACH ROW
WHEN (:new.capacite != :old.capacite)
BEGIN
UPDATE Cinema
SET capacite = capacite - :old.capacite +
:new.capacite
WHERE nom = :new.nomCinema;
END;

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 :

CREATE TRIGGER CumulCapaciteGlobal


AFTER INSERT OR DELETE OR UPDATE OF capacite
ON Salle
BEGIN
UPDATE Cinema C
SET capacite = (SELECT SUM (capacite) FROM Salle S
WHERE C.nom = S.nomCinema);
END;
2013-2014 16
Les triggers
Trigger INSTEAD OF
 Faire une action "à la place" d’une autre
 Ils permettent de modifier des vues (ils sont donc liés à une
vue, pas à une table).
 Pas encore normalisés mais ça devrait venir (utilisés par
plusieurs SGBD)
 Oracle les propose depuis la version 8 (serveur Entreprise)

Limitations par rapport au triggers TABLE


 Pas d’option BEFORE ou AFTER
 uniquement triggers FOR EACH ROW
2013-2014 17
Les triggers

Exemple de trigger INSTEAD OF

 Create view ParamountMovie As


select title, year from movie
where studioName = ’Paramount’;

 create trigger ParamountInsert


instead of insert on ParamountMovie
for each row
begin
insert into Movie(title,year,studioName)
values (:new.title, :new.year, ’Paramount’)
end ;
2013-2014 18
Exemple de trigger avec condition

CREATE OR REPLACE TRIGGER ajoutFilm


BEFORE INSERT ON film
BEGIN
IF USER != 'FFIOREN' THEN
RAISE_APPLICATION_ERROR (-20001,'Utilisateur interdit');
END IF;
END;

PL/SQL 19

2023-2024
Exemple

CREATE OR REPLACE TRIGGER updateFilm


BEFORE UPDATE OF titre ON film
BEGIN
IF USER != 'FFIOREN' THEN
RAISE_APPLICATION_ERROR (-20001,'Utilisateur interdit');
END IF;
END;

PL/SQL 20

2023-2024
Déclencheur par ligne

CREATE [OR REPLACE] TRIGGER


nom-déclencheur
moment
événement [OR événement]
ON nom-table
FOR EACH ROW
[WHERE condition]
bloc-PL/SQL;
PL/SQL 21

2023-2024
Exemple trigger par ligne

CREATE OR REPLACE TRIGGER auditEx AFTER On suppose ici


qu’il existe une
DELETE OR UPDATE OR INSERT table
ON exemplaire FOR EACH ROW BEGIN reportExemplair
IF DELETING OR UPDATING THEN e qui a la meme
INSERT INTO reportExemplaire structure de la
table
VALUES(SYSDATE, :OLD.numExemplaire,
Exemplaire
:OLD.numFilm, :OLD.codeSupport, :OLD.vo,
:OLD.probleme, :OLD.detailSupport);
END IF;
IF INSERTING THEN NULL; END IF;
END;
PL/SQL 2023-2024 22
Tables système

 USER_TRIGGERS

 ALL_TRIGGERS

 DBA_TRIGGERS

PL/SQL 23

2023-2024
Suppression

DROP TRIGGER nom-déclencheur;

PL/SQL 24

2023-2024
Activation/Désactivation

 ALTER TRIGGER nom-déclencheur DISABLE;


 ALTER TABLE nom-table DISABLE ALL TRIGGERS;
 ALTER TRIGGER nom-déclencheur ENABLE;
 ALTER TABLE nom-table ENABLE ALL TRIGGERS;

PL/SQL 25

2023-2024
Restrictions

• L’exécution d’un déclencheur dont le bloc PL/SQL inclut


des ordres INSERT, DELETE ou UPDATE peut entraîner
la mise en œuvre d’un autre déclencheur associé à la
table modifiée par ces actions
• Dans ce cas, lors de l’exécution d’un
déclencheur de type ligne :
• Aucun ordre SQL ne doit consulter ou modifier une
table déjà utilisée en mode modification par un autre
utilisateur.

PL/SQL 26

2023-2024
Restrictions (suite)

• Un déclencheur ne peut modifier la valeur d’un attribut


déclaré avec l’une des contraintes PRIMARY KEY,
UNIQUE ou FOREIGN KEY.
• Un déclencheur ne peut pas consulter les données d’une
table en mutation : une table en mutation est une table
directement ou indirectement concernée par l’événement
qui a provoqué la mise en œuvre du déclencheur.

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

Vous aimerez peut-être aussi