Vous êtes sur la page 1sur 6

Introduction aux Bases de Données : Trigger Introduction aux Bases de Données : Trigger

Contenu du cours
•  Triggers
▫  Principes
▫  Déclenchement
Les déclencheurs

Nicolas Travers
Équipe Vertigo - Laboratoire CEDRIC
Conservatoire National des Arts & Métiers, Paris, France

(D après les supports de Michel Crucianu, Cédric du Mouza et Philippe Rigaux)


Triggers N. Travers 1 Triggers N. Travers 2

Introduction aux Bases de Données : Trigger Introduction aux Bases de Données : Trigger

Déclencheurs
•  Trigger
! Un trigger de type Evénement/Action (EA) est
▫  Programme déclenché par un événement
▫  N’est pas appelé explicitement par une application
composé d'
•  Événements déclencheurs :
▫  Instruction LMD : INSERT, UPDATE, DELETE
▫  Instruction LDD : CREATE, ALTER, DROP
▫  Démarrage ou arrêt de la base un événement qui va le une action à exécuter
▫  Connexion ou déconnexion d’utilisateur
déclencher au déclenchement
▫  Erreur d’exécution
•  Usage fréquent
▫  Contraintes non exprimables sur les tables
▫  Modification des dépendances

Triggers N. Travers 3 Triggers N. Travers


Introduction aux Bases de Données : Trigger Introduction aux Bases de Données : Trigger

Définition d un déclencheur
! Un trigger est associé à une table •  Structure :
▫  Description de l’événement
▫  Condition supplémentaire à satisfaire (optionnel)
▫  Traitement à réaliser
•  Syntaxe pour déclenchement sur instruction LMD :
CREATE [OR REPLACE] TRIGGER nomDeclencheur
L'événement qui le L'action à exécuter est {BEFORE | AFTER | INSTEAD OF}
déclenche est une spécifiée par un bloc PL/ {DELETE | INSERT | UPDATE [OF colonne 1, …] [OR …]}
ON {nomTable | nomVue}
opération (insertion, SQL. [REFERENCING {OLD [AS] nomAncien | NEW [AS] nomNouveau
suppression, MAJ) sur | PARENT [AS] nomParent } …]
cette relation; [FOR EACH ROW]
[WHEN conditionSupplementaire]
{[DECLARE …] BEGIN … [EXCEPTION …] END;
| CALL nomSousProgramme(listeParametres)}

Triggers N. Travers Triggers N. Travers 6

Introduction aux Bases de Données : Trigger Introduction aux Bases de Données : Trigger

Déclencheurs sur instruction LMD Déclencheurs sur instruction LMD


•  Quand le déclenchement a lieu ? •  Changement des noms par défaut : REFERENCING
▫  :OLD désigne un enregistrement à effacer (déclencheur sur
▫  Avant l’événement : BEFORE DELETE, UPDATE) : REFERENCING OLD AS nomAncien
▫  Après l’événement : AFTER ▫  :NEW désigne un enregistrement à insérer (déclencheur sur
INSERT, UPDATE) : REFERENCING NEW AS nomNouveau
▫  À la place de l’événement : INSTEAD OF
▫  :PARENT pour des nested tables : REFERENCING PARENT AS
(uniquement pour vues multi-tables) nomParent
•  Description de l événement : •  FOR EACH ROW :
▫  La ou les (OR) instructions, ▫  Avec FOR EACH ROW, 1 exécution par ligne concernée par
l’instruction LMD (row trigger)
▫  Si l’événement concerne des colonnes ▫  Sans FOR EACH ROW, 1 exécution par instruction LMD (statement
spécifiques ([OF colonne 1, …]) ou non, trigger)
▫  Le nom de la table (ou vue) (ON {nomTable |
nomVue})

Triggers N. Travers 7 Triggers N. Travers 8


Introduction aux Bases de Données : Trigger Introduction aux Bases de Données : Trigger

Base exemple Déclencheur sur INSERT


•  Schéma : •  Pour un nouvel occupant,
Immeuble (Adr, NbEtg, DateConstr, NomGerant) ▫  si occupant.DateArrivee > immeuble.DateConstr
Appart (Adr, Num, Type, Superficie, Etg, NbOccup)
▫  (FOR EACH ROW est nécessaire pour avoir accès à :NEW,
Personne (Nom, Age, CodeProf)
Occupant (Adr, NumApp, NomOccup, DateArrivee, DateDepart)
l’enregistrement ajouté) :
Propriete (Adr, NomProprietaire, QuotePart)
CREATE TRIGGER TriggerVerificationDates
•  Exemples de contraintes à satisfaire : BEFORE INSERT ON occupant FOR EACH ROW
▫  propriete : CONSTRAINT prop_pers FOREIGN KEY DECLARE
Imm immeuble%ROWTYPE;
(NomProprietaire) REFERENCES personne (Nom)
BEGIN
▫  occupant : CONSTRAINT dates CHECK (DateArrivee < SELECT * INTO Imm FROM immeuble
DateDepart) WHERE immeuble.Adr = :NEW.Adr;
▫  Règles de gestion : IF :NEW.DateArrivee < Imm.DateConstr THEN
!  ∑ quotes-parts (propriété) = 100 ; RAISE_APPLICATION_ERROR(-20100, :NEW.Nom ||
arrivé avant construction immeuble ||
!  ∀ o ∈ occupant | o.DateArrive > Immeuble.dateConstr Imm.Adr);
!  … exercice : trouver d’autres contraintes END IF;
!  → déclencheurs si erreur END;

Triggers N. Travers 9 Triggers N. Travers 10

Introduction aux Bases de Données : Trigger Introduction aux Bases de Données : Trigger

Déclencheur sur INSERT (2) Déclencheur sur INSERT (3)


•  Immeuble => au moins un appartement •  Pour un nouvel appartement,
▫  si appartement.nbOccupant > 0
CREATE TRIGGER TriggerAppartInitial
AFTER INSERT ON immeuble FOR EACH ROW
▫  Renvoyer une erreur
BEGIN ▫  (WHEN est nécessaire pour vérifier la condition)
INSERT INTO appart (Adr, Num, NbOccup)
CREATE TRIGGER TriggerVerificationAppartement
VALUES (:NEW.Adr, 1, 0);
AFTER INSERT ON appartement FOR EACH ROW
END;
WHEN NEW.nbOccupant > 0
-- NEW ne prend pas de : dans la clause WHEN
•  Exercice : faire le déclencheur pour la quote-part BEGIN
RAISE_APPLICATION_ERROR(-20101, l appartement
|| :NEW.Adr || Ne peut avoir d’occupant non
encore enregistré’);
END IF;
END;

Triggers N. Travers 11 Triggers N. Travers 12


Introduction aux Bases de Données : Trigger Introduction aux Bases de Données : Trigger

Déclencheur sur DELETE Déclencheur sur UPDATE


•  Suppression d un occupant •  Modification d un occupant
▫  Si changement d’adresse
▫  Décrémenter appart.NbOccup ▫  Changer appart.NbOccup pour :OLD et :NEW
▫  Après effacement
CREATE TRIGGER TriggerMAJNombreOccupants
!  FOR EACH ROW est nécessaire (plusieurs occupants peuvent AFTER UPDATE ON occupant FOR EACH ROW
être concernés) => accès à :OLD BEGIN
IF :OLD.Adr <> :NEW.Adr OR
:OLD.NumApp <> :NEW.NumApp
CREATE TRIGGER TriggerDiminutionNombreOccupants THEN
AFTER DELETE ON occupant FOR EACH ROW UPDATE appart SET NbOccup = NbOccup - 1
WHERE appart.Adr = :OLD.Adr
BEGIN AND appart.Num = :OLD.NumApp;
UPDATE appart SET NbOccup = NbOccup - 1 UPDATE appart SET NbOccup = NbOccup + 1
WHERE appart.Adr = :OLD.Adr WHERE appart.Adr = :NEW.Adr
AND appart.Num = :NEW.NumApp;
AND appart.Num = :OLD.NumApp; END IF;
END; END;

Triggers N. Travers 13 Triggers N. Travers 14

Introduction aux Bases de Données : Trigger Introduction aux Bases de Données : Trigger

Déclencheur sur conditions


Déclencheurs sur instruction LDD
multiples
•  Un seul déclencheur pour INSERT, DELETE, UPDATE •  Syntaxe pour déclenchement sur instruction LDD :
CREATE [OR REPLACE] TRIGGER nomDeclencheur
CREATE TRIGGER TriggerCompletMAJNombreOccupants
AFTER INSERT OR DELETE OR UPDATE BEFORE | AFTER <action> [OR <action> …]
ON occupant FOR EACH ROW ON {[nomSchema.]SCHEMA | DATABASE}
BEGIN {[DECLARE …] BEGIN … [EXCEPTION …] END;
IF (INSERTING) THEN | CALL nomSousProgramme(listeParametres)}

ELSIF (DELETING) THEN
… •  SCHEMA : déclencheur valable pour schéma courant
ELSIF (UPDATING) THEN •  Quelques actions :

END IF; ▫  CREATE, RENAME, ALTER, DROP sur un objet du dictionnaire
END; ▫  GRANT, REVOKE privilège(s) à un utilisateur
•  Exercice : Créer le déclencheur pour mettre à jour les
valeurs de appart.NbOccup pour chaque cas.

Triggers N. Travers 15 Triggers N. Travers 16


Introduction aux Bases de Données : Trigger Introduction aux Bases de Données : Trigger

Déclencheur sur LDD : exemple Déclencheurs d instance


•  Enregistrement des changements de noms des objets du •  Syntaxe :
dictionnaire :
historiqueChangementNoms(Date,NomObjet,NomProprietaire) CREATE [OR REPLACE] TRIGGER nomDeclencheur
BEFORE | AFTER <evenement> [OR <evenement> …]
CREATE TRIGGER TriggerHistoriqueChangementNoms ON {[nomSchema.]SCHEMA | DATABASE}
AFTER RENAME ON DATABASE
BEGIN {[DECLARE …] BEGIN … [EXCEPTION …] END;
-- On se sert de 2 attributs système | CALL nomSousProgramme(listeParametres)}
-- ora_dict_obj_name : nom objet affecté
-- ora_dict_obj_owner : propriétaire objet affecté •  Événements déclencheurs concernés :
INSERT INTO historiqueChangementNoms ▫  Démarrage ou arrêt de la base :
VALUES (SYSDATE, ora_dict_obj_name, !  SHUTDOWN ou STARTUP
ora_dict_obj_owner);
END;
▫  Connexion ou déconnexion d’utilisateur :
!  LOGON ou LOGOFF
▫  Erreurs :
!  SERVERERROR, NO_DATA_FOUND, …
Triggers N. Travers 17 Triggers N. Travers 18

Introduction aux Bases de Données : Trigger Introduction aux Bases de Données : Trigger

Déclencheur d instance : exemple Manipulation d un déclencheur


•  Afficher l identité de l objet ayant provoqué un débordement : •  Tout déclencheur est actif dès sa compilation !
CREATE TRIGGER TriggerDebordement
AFTER SERVERERROR ON DATABASE •  Re-compilation d un déclencheur après modification :
DECLARE
eno NUMBER; ALTER TRIGGER nomDeclencheur COMPILE;
typ VARCHAR2; owner VARCHAR2; ts VARCHAR2; •  Désactivation de déclencheurs :
obj VARCHAR2; subobj VARCHAR2;
BEGIN ALTER TRIGGER nomDeclencheur DISABLE;
IF (space_error_info(eno,typ,owner,ts,obj,subobj) = ALTER TABLE nomTable DISABLE ALL TRIGGERS;
TRUE) THEN
DBMS_OUTPUT.PUT_LINE( L'objet || obj || •  Réactivation de déclencheurs :
de || owner || a débordé ! ); ALTER TRIGGER nomDeclencheur ENABLE;
END IF;
END; ALTER TABLE nomTable ENABLE ALL TRIGGERS;
•  Suppression d un déclencheur :
DROP TRIGGER nomDeclencheur;

Triggers N. Travers 19 Triggers N. Travers 20


Introduction aux Bases de Données : Trigger Introduction aux Bases de Données : Trigger

Déclencheurs et Concurrence Conclusion


•  Pas d'instruction Un déclencheur permet de
•  COMMIT •  Contrôler l'intégrité,
•  Maintenir des renseignements sur l'activité de la
•  ROLLBACK
base,
•  SAVEPOINT
•  Rendre le SGBD "actif”
•  En calculant automatiquement certains attributs,
•  En insérant, modifiant ou supprimant des tuples,
•  Contrôler dynamiquement certaines manipulations
de la base,
•  Rafraîchir des données dupliquées.

Triggers N. Travers 21 Triggers N. Travers 22

Introduction aux Bases de Données : Trigger Introduction aux Bases de Données : Trigger

Droits de création et manipulation Trigger et MySQL


•  Déclencheurs d instance : privilège •  Doc : http://dev.mysql.com/doc/refman/5.0/fr/triggers.html
ADMINISTER DATABASE TRIGGER
•  PL/SQL de MySQL (variables, curseurs…)

•  Autres déclencheurs :
▫  Dans tout schéma : privilège
CREATE ANY TRIGGER
▫  Dans votre schéma : privilège
CREATE TRIGGER (rôle RESOURCE)

Triggers N. Travers 23 Triggers N. Travers 24

Vous aimerez peut-être aussi