1. Ministère de l’Enseignement Supérieur et de recherche
scientifique
Université de Sousse
Chapitre6 :
Les déclencheurs (Triggers)
2022-2023
2. Un trigger (déclencheur) est un programme qui se déclenche automatiquement suite
à un événement de mise à jour.
Les triggers peuvent servir à :
vérifier des contraintes que l'on ne peut pas définir de façon déclarative
I. Introduction
2
gérer de la redondance d'information, après une dénormalisation du schéma
collecter des informations sur les mises-à-jour de la base.
3. 3
II. Création d'un Trigger : Syntaxe
CREATE [OR REPLACE] TRIGGER nom_trig
BEFORE|AFTER
INSERT|DELETE|UPDATE ON nom_table
[ FOR EACH ROW]
[ WHEN condition]
-- Bloc PL/SQL contenant le corps du trigger
Syntaxe :
After ou Before : détermine le moment où le trigger va se déclencher par rapport à
l'instruction DML (avant ou après)
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
4. 4
Si cette clause est absente, alors le trigger va se déclencher une seule fois pour toute
l'instruction. On parle alors de trigger instruction.
Indique que le trigger doit s'exécuterr pour chaque ligne modifiée/insérée ou
supprimée. On parle alors de trigger ligne.
Dans un trigger ligne, on peut faire référence à la ligne courante, celle pour laquelle
le trigger s'exécute.
Pour cette ligne, on a accès à la valeur avant l'instruction DML (nommée :old) et à
la valeur après l'instruction (nommée :new).
:old :new
Insert NULL ligne insérée
Delete ligne supprimée NULL
Update ligne avant modif ligne après modif
III. La clause For each row
6. 6
définit une condition pour un trigger ligne : le trigger se déclenchera pour chaque ligne
vérifiant la condition.
Exemple 1: Le trigger suivant insère une ligne dans une table de log, lorsque le salaire
d'un employé diminue.
CREATE or REPLACE TRIGGER journal_emp
AFTER update of sal on EMP
FOR EACH ROW
WHEN(new.sal < old.sal)
-- attention, ici on utilise new et pas :new
BEGIN
insert into EMP_LOG(emp_id, date_evt, msg)
values (:new.empno, sysdate, 'salaire diminué');
END;
III. La Clause When
7. 7
Exemple 2: soit la table étudiant suivante
CREATE TRIGGER moyenneMax
AFTER UPDATE ON etudiant
FOR EACH ROW
WHEN :NEW.moyenne> 2*:OLD.moyenne
BEGIN
INSERT INTO alerte(datealerte, numEtudiant, message)
VALUES ( SYSDATE, :OLD.nom, 'MOYENNE a plus que double');
END;
Le trigger suivant permet de………………………………………………….
………………………………………………………………………………………
………………………………………………………………………………………
III. La Clause When
8. 8
Le bloc d’instructions PL/SQL peut contenir :
IV. Le corps du trigger
IF INSERTING THEN bloc d’instructions pl/sql END IF
IF UPDATING THEN bloc d’instructions pl/sql END IF
IF DELETING THEN bloc d’instructions pl/sql END IF
Quand des événements (INSERT, UPDATE ou DELETE) sont regroupés ensemble
au sein d’un même déclencheur, on peut les manipuler par :
Instructions SQL
SELECT, INSERT, UPDATE, DELETE à l’exception de COMMIT et ROLLBACK
IF condition THEN instructions pl/sql ELSE instructions pl/sql END IF;
LOOP instructions pl/sql EXIT WHEN (condition) END LOOP;
WHILE condition LOOP instructions pl/sql END LOOP;
FOR variable IN start..stop LOOP instructions pl/sql END LOOP;
Instructions de contrôle de flux
10. 10
Le bloc d’instructions PL/SQL peut contenir :
IV. Le corps du trigger
Curseurs
Procédures et fonctions
Gestion des exceptions
Génération des exceptions
raise_application_error(nombre,message)
Autres possibilités plus avancées
11. 11
Exemple
IV. Le corps du trigger
La table Salgrade qui définit les salaires minimal et maximal de chaque grade d'employé.
EMP(EMPNO, ENAME, JOB, GRADE, MGR, SAL, COMM, DEPTNO#)
DEPT(DEPTNO, DNAME, LOC)
PROJET(CodeP, NomP)
PARTICIPATION(EMPNO#, CodeP#, Fonction)
SALGRADE(GRADE, lonsal , hisal)
Définir un trigger pour vérifier, avant une insertion ou modification de salaire dans la
table EMP, que le nouveau salaire soit valide (c-a-d ne soit pas inferieur à minsal et ne
soit pas supérieur à maxsal) .
Il faut traiter les cas de non validité de salaire dans une exception en affichant un
message disant que le salaire est hors rang.
Il faut aussi traiter le cas où le grade à insérer n'existe pas dans la table SALGRADE.
12. 12
CREATE TRIGGER sal_check
BEFORE INSERT OR UPDATE OF sal ON emp
FOR EACH ROW
DECLARE
minsal NUMBER;
maxsal NUMBER;
sal_hors_rang EXCEPTION;
BEGIN
SELECT losal, hisal INTO minsal, maxsal FROM salgrade
WHERE grade= :new.grade;
IF (:new.sal < minsal OR :new.sal > maxsal) THEN
RAISE sal_hors_rang;
END IF;
EXCEPTION
WHEN sal_hors_rang THEN
DBMS_OUTPUT.PUT_LINE('Salaire' || TO_CHAR (:new.sal) || ' hors rang');
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE( 'Igrade nvalide ');
END;
13. 13
II. Trigger : création
Activation / désactivation d'un seul déclencheur
Alter Trigger nom_declencheur Disable | Enable;
Drop TRIGGER nom_declancheur;
Activation / désactivation de tous les déclencheurs associés à une table
Alter Table nom_table Disable | Enable ALL TRIGGERS;
Suppression d'un déclencheur