Vous êtes sur la page 1sur 13

Ministère de l’Enseignement Supérieur et de recherche scientifique

Université de Sousse

Chapitre6 :
Les déclencheurs (Triggers)

2022-2023
I. Introduction
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

 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.

2
II. Création d'un Trigger : Syntaxe
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

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


3
trigger : utiliser AFTER
III. La clause For each row
 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.

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.

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
4
CREATE TABLE EMP_LOG (
 emp_id integer NOT NULL,
date_evt date,
 msg VARCHAR(50));

5
III. La Clause When
 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;
6
III. La Clause When
Exemple 2: soit la table étudiant suivante

Le trigger suivant permet de………………………………………………….


………………………………………………………………………………………
………………………………………………………………………………………
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;
7
IV. Le corps du trigger
e bloc d’instructions PL/SQL peut contenir :
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 :
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

Instructions SQL
SELECT, INSERT, UPDATE, DELETE à l’exception de COMMIT et ROLLBACK
Instructions de contrôle de flux

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;
8
III. La Clause When
Exemple 3:

9
IV. Le corps du trigger
e bloc d’instructions PL/SQL peut contenir :
Génération des exceptions
raise_application_error(nombre,message)

 Autres possibilités plus avancées

Curseurs
Procédures et fonctions
Gestion des exceptions

10
IV. Le corps du trigger
xemple

EMP(EMPNO, ENAME, JOB, GRADE, MGR, SAL, COMM, DEPTNO#)


DEPT(DEPTNO, DNAME, LOC)
PROJET(CodeP, NomP)
PARTICIPATION(EMPNO#, CodeP#, Fonction)
SALGRADE(GRADE, losal , hisal)

La table Salgrade qui définit les salaires minimal et maximal de chaque grade d'employé.

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 à losal et ne
soit pas supérieur à hisal) .
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.
11
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; 12
II. Trigger : création
ctivation / désactivation d'un seul déclencheur

Alter Trigger nom_declencheur Disable | Enable;

ctivation / désactivation de tous les déclencheurs associés à une table

Alter Table nom_table Disable | Enable ALL TRIGGERS;

uppression d'un déclencheur

 Drop TRIGGER nom_declancheur;

13

Vous aimerez peut-être aussi