Les Déclencheurs
(TRIGGERs)
Master II - RISR ... Adminstartion et Sécurité des Systèmes d'Information Répartis (ASSIR)
Ministère de l’Enseignement Supérieur et de la Recherche Scientifique
Université Dr Tahar Moulay de Saïda
Faculté de Technologie
Département d’Informatique
Master II - Réseaux Informatiques et Systèmes Répartis (RISR)
UEF32 - Administration et Sécurité des Systèmes d’Information Répartis (ASSIR)
Master II - RISR ... Adminstartion et Sécurité des Systèmes d'Information Répartis (ASSIR)
Définitions
• Un trigger (déclencheur) est un programme
qui se déclenche automatiquement suite à un
événement.
• C’est un concept de base de données active et
ils existent dans la plupart des SGBDs.
Master II - RISR ... Adminstartion et Sécurité des Systèmes d'Information Répartis (ASSIR)
Principes des triggers
• basé sur la séquence (ECA)
Evénement-Condition-Action
Evenement: un trigger est déclenché par un évènement,
spécifié par le programmeur, qui est en général une
insertion, suppression ou modification sur une table
Condition: la première action d’un trigger est de tester
une condition : si cette condition ne s’évalue pas à
TRUE, l’exécution s’arrête ;
Action: peut consister en toute opération sur la base de
données : les SGBD fournissent un langage impératif
permettant de créer de véritables procédures.
Master II - RISR ... Adminstartion et Sécurité des Systèmes d'Information Répartis (ASSIR)
Utilisations des triggers
• Pour garantir qu’une propriété est vérifiée
– Exemple:
– garantir que le nombre d’étudiants inscrits à une unité
d’enseignement est toujours inférieur à sa capacité d’accueil.
– garantir que le salaire d’un employé est inférieur à celui de
son supérieur.
• Pour automatiser des traitements lors de
certains événements
– Exemple:
– créer une commande de produit à chaque fois que sa quantité
en stock passe en dessous d’un certain seuil.
• Pour programmer des contraintes d’intégrités
- (Base de données Réparties).
Master II - RISR ... Adminstartion et Sécurité des Systèmes d'Information Répartis (ASSIR)
Syntaxe
CREATE [OR REPLACE] TRIGGER<nom-trigger>
<quand> <évenements> ON <table>
[FOR EACH ROW [WHEN <condition>]]
BEGIN
<action>
END;
BEFORE ou AFTER (table) ou
INSTEAD OF (vue)
DELETE, UPDATE ou INSERT
séparés par des OR.
est une procédure qui peut être
implantée, sous Oracle, avec le
langage PL/SQL
toute condition
booléenne SQL
est optionnelle
Master II - RISR ... Adminstartion et Sécurité des Systèmes d'Information Répartis (ASSIR)
Types de triggers
• ORACLE propose deux types de triggers
- les triggers lignes qui se déclenchent individuellement pour
chaque ligne de la table affectée par le trigger,
- les triggers globaux qui sont déclenchées une seule fois.
- Si l'option FOR EACH ROW est spécifiée, c'est un trigger ligne, sinon
c'est un trigger global.
• Pour les triggers lignes, on peut introduire une restriction sur les
lignes à l'aide d'une expression logique SQL : c'est la clause WHEN :
– Le trigger n'est déclenché sur une ligne que si l'expression WHEN est
vérifiée pour cette ligne.
– Par exemple, WHEN (new.empno>0) empêchera l'exécution du trigger
si la nouvelle valeur de EMPNO est 0, négative ou NULL.
Master II - RISR ... Adminstartion et Sécurité des Systèmes d'Information Répartis (ASSIR)
Manipulation de valeur
• Deux valeurs sont manipulés
– La nouvelle valeur est appelée :new.colonne
– L'ancienne valeur est appelée :old.colonne
• Exemple : IF :new.salaire < :old.salaire ........
:old :new
insert null ligne insérée
delete ligne supprimée null
update ligne avant modif ligne après modif
Master II - RISR ... Adminstartion et Sécurité des Systèmes d'Information Répartis (ASSIR)
Les prédicats conditionnelles
• Quand un trigger comporte plusieurs instructions de
déclenchement (par exemple INSERT OR DELETE OR UPDATE),
on peut utiliser des prédicats conditionnels (INSERTING,
DELETING et UPDATING) pour exécuter des blocs de code
spécifiques pour chaque instruction de déclenchement.
Exemple :
CREATE TRIGGER ...
BEFORE INSERT OR UPDATE ON employe
.......
BEGIN
......
IF INSERTING THEN ....... END IF;
IF UPDATING THEN ........ END IF;
......
END;
Master II - RISR ... Adminstartion et Sécurité des Systèmes d'Information Répartis (ASSIR)
Activation d’un Trigger
• Un trigger peut être activé ou désactivé. Par défaut, un trigger est activé dès sa
création.
• S’il est désactivé, ORACLE le stocke mais l’ignore.
• On peut désactiver un trigger si :
• il référence un objet non disponible
• on veut charger rapidement un volume de données important ou recharger des
données déjà contrôlées.
• Pour désactiver un trigger, on utilise l’instruction:
ALTER TRIGGER nomtrigger DISABLE;
• On peut désactiver tous les triggers associés à une table avec la commande :
ALTER TABLE nomtable DISABLE ALL TRIGGERS;
• - A l’inverse on peut réactiver un trigger :
ALTER TRIGGER nomtrigger ENABLE;
• ou tous les triggers associés à une table :
ALTER TABLE nomtable ENABLE ALL TRIGGERS;
Master II - RISR ... Adminstartion et Sécurité des Systèmes d'Information Répartis (ASSIR)
Références aux valeurs modifiées
CREATE TRIGGER MAJ_Log
AFTER UPDATE ON Pays
FOR EACH ROW
WHEN (new.surface <> old.surface)
BEGIN
INSERT INTO Pays_log (nom, libellé)
VALUES (:new.nom, 'surface_changée');
END;
Master II - RISR ... Adminstartion et Sécurité des Systèmes d'Information Répartis (ASSIR)
Gestion d'exceptions
• Si une erreur se produit pendant l'exécution d'un trigger, toutes les
mises à jour produites par le trigger ainsi que par l'instruction qui l'a
déclenché sont défaites.
• On peut introduire des exceptions en provoquant des erreurs.
• Une exception est une erreur générée dans une procédure
PL/SQL. Un bloc PL/SQL peut contenir un bloc EXCEPTION gérant
les différentes erreurs possibles avec des clauses WHEN.
• Elle peut être prédéfinie ou définie par l'utilisateur.
• Une clause WHEN OTHERS THEN; gère le cas des erreurs non
prévues.
Master II - RISR ... Adminstartion et Sécurité des Systèmes d'Information Répartis (ASSIR)
Exemple d’exceptions prédéfinit
• NO_DATA_FOUND
– cette exception est générée quand un SELECT
INTO ne retourne pas de lignes
• DUP_VAL_ON_INDEX
– tentative d'insertion d'une ligne avec une valeur
déjà existante pour une colonne à index unique
• ZERO_DIVIDE
– division par zéro
Master II - RISR ... Adminstartion et Sécurité des Systèmes d'Information Répartis (ASSIR)
Bloc Exception
BEGIN
…
EXCEPTION
WHEN exception1 [OR exception2 …] THEN
instructions;
[WHEN exception3 [OR exception4 …] THEN
instructions; ]
[WHEN OTHERS THEN
instructions; ]
END;
Master II - RISR ... Adminstartion et Sécurité des Systèmes d'Information Répartis (ASSIR)
Exception utilisateur
Déclaration
La déclaration du nom de l’exception doit se trouver dans la section
déclarative du bloc PL/SQL.
nomException EXCEPTION;
Déclenchement
- Une exception utilisateur ne sera pas levée de la même manière
qu’une exception interne.
- Le programme doit explicitement dérouter le traitement vers le
bloc des exceptions par la directive RAISE.
Master II - RISR ... Adminstartion et Sécurité des Systèmes d'Information Répartis (ASSIR)
Exception utilisateur
DECLARE
erreur_PK_reparti EXCEPTION;
BEGIN
…
IF condition THEN RAISE erreur_PK_reparti;
END IF;
EXCEPTION
WHEN erreur_PK_reparti THEN
ROLLBACK;
DBMS_OUTPUT.PUT_LINE ('Désolé, là clé existe déjà!');
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Pas de produit de numéro : ‘ || v_nump);
WHEN OTHERS THEN
ROLLBACK;
DBMS_OUTPUT.PUT_LINE('Erreur d''Oracle ' || SQLERRM || '(' ||
SQLCODE || ')');
END;
Master II - RISR ... Adminstartion et Sécurité des Systèmes d'Information Répartis (ASSIR)
Procédure RAISE_APPLICATION ERROR
La procédure RAISE_APPLICATION_ERROR permet de définir ses
propres messages et codes d’erreurs.
- numéroErreur : valeur définie par l'utilisateur pour l'exception,
comprise entre –20 000 et –20 999 ;
- message : chaîne de caractères (max 2 048 octets) décrivant
l’erreur.
- TRUE | FALSE : booléen facultatif. TRUE positionne l’erreur
dans une pile si plusieurs exceptions doivent être propagées en
cascade., FALSE par défaut remplace toutes les erreurs
précédentes dans la pile.
RAISE_APPLICATION_ERROR(numéroErreur, message [, {TRUE |
FALSE}]);
Master II - RISR ... Adminstartion et Sécurité des Systèmes d'Information Répartis (ASSIR)
BEGIN
….
IF condition THEN
RAISE_APPLICATION_ERROR(-20102, ‘Insertion non autorisée!');
END IF;
…
END;
Procédure RAISE_APPLICATION ERROR
Master II - RISR ... Adminstartion et Sécurité des Systèmes d'Information Répartis (ASSIR)
BLOC PL/SQL
- Les structures de contrôle habituelles d’un langage (IF, WHILE…) ne
font pas partie intégrante de la norme SQL.
- Le langage PL/SQL (Procedural Langage/Structured Query Langage)
est le langage de prédilection d’Oracle
Avantages
La modularité (un bloc d’instruction peut être composé d’un
autre).
La portabilité : un programme PL/SQL est indépendant du système
d’exploitation qui héberge le serveur Oracle.
L’intégration avec les données des tables : on retrouvera avec
PL/SQL tous les types de données et instructions disponibles sous
SQL.
Master II - RISR ... Adminstartion et Sécurité des Systèmes d'Information Répartis (ASSIR)
Structure d’un Bloc PL/SQL
DECLARE (section optionnelle) déclare les variables, types,
curseurs, exceptions, etc. ;
BEGIN (section obligatoire) contient le code PL/SQL incluant ou non
des directives SQL (jusqu’à l’instruction END;).
Le caractère « / » termine un bloc pour son exécution dans
l’interface SQL*Plus.
EXCEPTION (section optionnelle) permet de traiter les erreurs
retournées par le SGBD à la suite d’exécutions d’instructions SQL.
Master II - RISR ... Adminstartion et Sécurité des Systèmes d'Information Répartis (ASSIR)
Structure d’un Bloc PL/SQL
Master II - RISR ... Adminstartion et Sécurité des Systèmes d'Information Répartis (ASSIR)
Variables
identificateur [CONSTANT] typeDeDonnée [NOT NULL] [:= |
DEFAULT expression];
identificateur : lettres , chiffres , $ , _ , #
DECLARE
v_dateNaissance DATE;
/* équivaut à v_dateNaissance
DATE:= NULL; */
v_capacite NUMBER(3) := 999;
v_telephone CHAR(14) NOT NULL := '06-76-85-14-89';
v_trouve BOOLEAN NOT NULL := TRUE;
BEGIN
v_capacite := 20;
v_dateNaissance := ’21/12/2015’;
Master II - RISR ... Adminstartion et Sécurité des Systèmes d'Information Répartis (ASSIR)
Variables
La directive %TYPE déclare une variable selon la définition
d’une colonne d’une table.
Elle permet aussi de déclarer une variable conformément à une
autre variable précédemment déclarée.
Variables %TYPE
•Il faut faire préfixer la directive %TYPE avec le nom de la
table et celui de la colonne :
identificateur nomTable.nomColonne%TYPE
•ou avec le nom d’une variable existante :
identificateur2 identificateur1%TYPE.
DECLARE
v_num etudiant.num_etud%TYPE;
v_prime NUMBER(5,2) := 500.50;
v_prime_min v_prime %TYPE := v_prime*0.9;
Master II - RISR ... Adminstartion et Sécurité des Systèmes d'Information Répartis (ASSIR)
Structures de contrôles
IF condition THEN
instructions;
END IF;
IF condition THEN
instructions;
ELSE
instructions;
END IF;
IF condition1 THEN
instructions;
ELSIF condition2 THEN
instructions;
ELSE
instructions;
END IF;
Master II - RISR ... Adminstartion et Sécurité des Systèmes d'Information Répartis (ASSIR)
Extraire des données
SELECT liste INTO { nomVariablePLSQL [,nomVariablePLSQL]…
| nomRECORD } FROM nomTable …;
DECLARE
v_nom etudiant.nom_etud%TYPE;
BEGIN
SELECT nom_etud INTO v_nom
FROM etudiant
WHERE num_etud=102158;
…
END;