Chapitre 7 : Les triggers ou déclencheurs

Transcription

Chapitre 7 : Les triggers ou déclencheurs
ALSI BTS IG développeurs
S25 : SGBDR
Chapitre 7 : Les triggers ou déclencheurs
1.
2.
3.
4.
5.
Introduction ..........................................................................................1
Qu’est-ce qu’un déclencheur ?...............................................................2
Création d’un déclencheur .....................................................................3
Modification et suppression d’un déclencheur .......................................6
4.1 Modification...................................................................................... 6
4.2 Suppression ..................................................................................... 6
Triggers en cascade...............................................................................7
1. Introduction
Lorsque l'on utilise un SGBD un certain nombre de contraintes permettent de renforcer
l'intégrité et la cohérence de la base de données comme :
•
La contrainte d’entité : les valeurs de la clé primaire (PRIMARY KEY) doivent être
uniques et non nulles (toujours spécifiées) ;
•
La contrainte d’intégrité : les valeurs prises par la clé étrangère (FOREIGN KEY)
d’une table doivent exister comme valeur de clé primaire dans l’autre table ;
•
La contrainte de domaine ou contrainte de validité : elle concerne le contrôle et la
validation des données (CHECK) par rapport à la définition d’un domaine de valeurs.
•
La contrainte de valeur par défaut : permet d’ajouter automatiquement une valeur
(DEFAULT) dans une colonne lorsqu’une insertion de ligne n’en a pas prévu l’entrée.
•
La contrainte d’unicité : empêche l’insertion de doublons dans une colonne
(UNIQUE).
Toutefois, ces différentes contraintes ne sont pas toujours suffisantes, notamment pour définir
les contraintes sur associations ou sur liens d’héritage.
Il existe ainsi d'autres moyens de renforcer l'intégrité et la cohérence d’une la base de données
notamment par la mise en œuvre des procédures déclenchées encore appelées
déclencheurs ou triggers.
Exemple :
On s’intéresse à une agence immobilière qui propose des logements à la vente. Ces logements
sont soit des appartements, soit des pavillons.
Un logement est caractérisé par une surface habitable, une adresse, un prix. Les appartements
sont en outre décrits par l’étage de l’immeuble alors que pour les pavillons on inclut une
surface de jardin.
SGBDR - Chapitre 7
Page 1 sur 7
2005-2006
ALSI BTS IG développeurs
S25 : SGBDR
Le modèle conceptuel des données associé à cet environnement est le suivant :
étage
surfaceJardin
Lors du passage au schéma relationnel, il est possible d’implémenter ce modèle de trois
façons :
•
Avec une seule table
LOGEMENT(NumLogement, SurfHabitable, Adresse, Prix, Etage, SurfJardin)
L’inconvénient d’un tel modèle est l’existence de nombreuses valeurs indéterminées dans la
table LOGEMENT
•
Avec deux tables
APPARTEMENT(NumLogement, SurfHabitable, Adresse, Prix, Etage)
PAVILLON(NumLogement, SurfHabitable, Adresse, Prix, SurfJardin)
•
Avec trois tables
LOGEMENT(NumLogement, SurfHabitable, Adresse, Prix)
APPARTEMENT(NumLogement#, Etage)
PAVILLON(NumLogement#, SurfJardin)
Si ces deux dernières solutions permettent de supprimer le problème des colonnes à valeur
indéterminée, il subsiste toutefois un obstacle : en effet, un même numéro de logement ne
doit pas se retrouver à la fois dans la table PAVILLON et dans la table APPARTEMENT.
Le langage de définition des données ne permet pas de mettre en place un tel contrôle.
Nous allons devoir recourir à des procédures déclenchées pour gérer au niveau du SGBDR
les différentes contraintes du MCD qui ne peuvent pas être implémentées directement à l’aide
du Langage de Définition de Données
2. Qu’est-ce qu’un déclencheur ?
Les triggers ou déclencheurs servent à étendre les mécanismes de gestion de l'intégrité
référentielle et permettre le contrôle de saisie.
Ils vont permettre d’implémenter des règles de gestion, de mettre en œuvre des contraintes
du type contraintes sur association, sur liens d’héritage, bref toutes les règles ne pouvant être
implémentées directement au travers du Langage de Définition des Données.
SGBDR - Chapitre 7
Page 2 sur 7
2005-2006
ALSI BTS IG développeurs
S25 : SGBDR
Il s'agit de code déclenché lors de certains événements de la base de données. Un trigger est
toujours rattaché à une table.
Les événements qui déclenche un trigger sont :
•
•
•
l'insertion de données (INSERT)
la suppression de données (DELETE)
la mise à jour de données (UPDATE)
Ils sont donc déclenchés systématiquement par une requête SQL.
Les déclencheurs, d’une façon générale, sont prévus pour gérer les mises à jour, les règles de
gestion et toute opération devant être faite à l’insu de l’utilisateur qui émet la transaction.
Emplois typiques :
•
•
•
•
•
•
•
gestion d'héritage avec lien d'exclusion
suppression, insertion et mise à jour en cascade
contrôle de validité
respect d'intégrité complexe
formatage de données
archivage automatique
...
•
Un déclencheur ou trigger est un lot d'instructions permettant de grouper un
ensemble de commandes SQL avec des instructions procédurales
•
Un déclencheur est déclenché implicitement et automatiquement par un ou
plusieurs événements prédéfinis.
•
Un déclencheur ne peut pas être appelé directement.
•
Un déclencheur est rattaché à une et une seule table.
•
Si une table est supprimée, les déclencheurs qui lui sont associés sont
automatiquement supprimés.
Tout comme les procédures stockées, les triggers sont exécutés côté serveur. Ainsi, dans une
architecture client/serveur, lorsque le client émet, vers le serveur, une requête de mise à jour
SQL sur une table à laquelle un trigger est rattaché, ce trigger s’exécutera sur le serveur avant
que la réponse ne soit retournée au client.
Cela allège le trafic réseau entre le client et le serveur.
3. Création d’un déclencheur
L'instruction CREATE TRIGGER permet de créer un déclencheur
La syntaxe en TRANSACT-SQL est la suivante :
CREATE TRIGGER nomDéclencheur
ON nomTable
{FOR | AFTER | INSTEAD OF} { [DELETE] [, INSERT] [, UPDATE] [,] }
AS
lotInstructionsTransactSQL
SGBDR - Chapitre 7
Page 3 sur 7
2005-2006
ALSI BTS IG développeurs
S25 : SGBDR
Les crochets […] indiquent des clauses optionnelles.
Le caractère | indique une alternative (l'un ou l'autre).
•
La clause ON permet de définir la table à laquelle s’applique le déclencheur
•
La clause FOR permet de préciser le ou les types d’évènements déclenchant le trigger
(insertion, modification et/ou suppression d’occurrences)
•
Les clauses DELETE, INSERT et UPDATE correspondent évènements déclencheurs du
trigger c'est-à-dire aux actions de l’utilisation sur les données de la table ou de la vue :
suppression, insertion et/ou modification.
Il est possible de définir un trigger pour plusieurs évènements. Dans ce cas on sépare
ces évènements par une virgule.
•
La clause AFTER indique que le trigger est déclenché après vérification des contraintes
d’intégrité et après mise à jour des données. C’est le mode par défaut des
déclencheurs. Ainsi les deux triggers ci-dessous sont identiques
CREATE TRIGGER monTrigger
ON maTable
FOR INSERT, DELETE
AS …
•
CREATE TRIGGER monTrigger
ON maTable
AFTER INSERT, DELETE
AS …
La clause INSTEAD OF indique que le contenu du déclencheur (lots d’instructions
spécifiées après la clause AS) est exécuté à la place de l'instruction SQL de
déclenchement (INSERT, UPDATE ou DELETE), remplaçant ainsi les actions de celle-ci.
Utilisation des tables INSERTED et DELETED
Lors des mises à jour de données, SQL Server crée des lignes dans des tables de travail
temporaires permettant de conserver les données modifiées pendant l'opération. Il s’agit
des tables inserted et deleted
•
Lors d’une commande INSERT, la table inserted contient une copie des lignes créées
•
Lors d’une commande DELETE, les lignes supprimées sont placées dans la table
deleted
•
Lors d’une commande UPDATE, les lignes à modifier (donc avant mise à jour) sont
placées dans la table deleted, les lignes modifiées (après mise à jour) sont placées
dans la table inserted
Ces informations sont directement accessibles dans le trigger et peuvent être utilisées dans
le traitement de la règle de gestion.
Les tables deleted et inserted ont la même structure que la table mise à jour par le
trigger et conservent les anciennes ou les nouvelles valeurs des lignes modifiées par
l'action de l'utilisateur.
Exemple
Reprenons notre exemple du départ, à savoir la gestion de logements par une agence
immobilière.
Nous considérerons dans cet exemple que nous avons implémenté 2 tables :
APPARTEMENT(NumLogement, SurfHabitable, Adresse, Prix, Etage)
PAVILLON(NumLogement, SurfHabitable, Adresse, Prix, SurfJardin)
SGBDR - Chapitre 7
Page 4 sur 7
2005-2006
ALSI BTS IG développeurs
S25 : SGBDR
1. Nous allons donc créer un premier trigger permettant de s’assurer qu’un pavillon ne
peut pas avoir le même numéro de logement qu’un appartement.
Ce trigger doit se déclencher lors de l’insertion d’un nouveau pavillon.
Il vérifiera qu’il n’existe pas d’appartement (table appartement) ayant un numéro de
logement identique à celui du pavillon en cours d’insertion (table inserted).
Si tel est le cas, un message est affiché et la transaction en cours (l’insertion) est
abandonnée.
CREATE TRIGGER CreationPavillon
ON PAVILLON
FOR INSERT
AS
DECLARE @verif integer
SELECT @verif count(*)
FROM appartement, inserted
WHERE appartement.NumLogement = inserted.NumLogement)
IF @verif <> 0
BEGIN
PRINT ‘Un appartement possède déjà ce numéro de logement’
ROLLBACK TRANSACTION
RETURN
END
2. De la même manière, il faut définir un déclencheur sur la table appartement pour
vérifier qu’il n’existe pas de pavillon ayant le même numéro de logement que
l’appartement en cours d’insertion.
CREATE TRIGGER CreationAppartement
ON APPARTEMENT
FOR INSERT
AS
DECLARE @verif integer
SELECT @verif = count(*)
FROM pavillon, inserted
WHERE pavillon.NumLogement = inserted.NumLogement)
IF @verif <> 0
BEGIN
PRINT ‘Un pavillon possède déjà ce numéro de logement’
ROLLBACK TRANSACTION
RETURN
END
SGBDR - Chapitre 7
Page 5 sur 7
2005-2006
ALSI BTS IG développeurs
S25 : SGBDR
4. Modification et suppression d’un déclencheur
4.1 Modification
L'instruction ALTER TRIGGER permet de modifier une procédure stockée
La syntaxe en TRANSACT-SQL est la suivante
ALTER TRIGGER nomDéclencheur
ON nomTable
{FOR | AFTER | INSTEAD OF} { [DELETE] [, INSERT] [, UPDATE] [,] }
AS
lotInstructionsTransactSQL
La modification d'une procédure stockée s'effectue sans changer les autorisations ni
affecter les procédures stockées ou les déclencheurs dépendant de celle-ci.
4.2 Suppression
L'instruction DROP TRIGGER permet de supprimer une procédure stockée
La syntaxe en TRANSACT-SQL est la suivante
DROP TRIGGER nomDéclencheur
SGBDR - Chapitre 7
Page 6 sur 7
2005-2006
ALSI BTS IG développeurs
S25 : SGBDR
5. Triggers en cascade
On qualifie de trigger en cascade un déclencheur qui déclenche des actions sur des
tables liées.
Exemple 1
Une insertion dans la table Ventes provoque une mise à jour dans la table HistoriqueVentes
CREATE TRIGGER InsertVentes
ON Ventes
FOR INSERT
AS
UPDATE HistoriqueVentes
SET HistoriqueVentes.QteVendue = HistoriqueVentes.QteVendue + inserted.Qte
WHERE HistoriqueVentes.NumArticle = inserted.NumArticle
Exemple 2
La suppression d’un fournisseur dans la table Fournisseur déclenche la suppression de tous les
articles de ce fournisseur dans la table Articles.
CREATE TRIGGER DeleteFourn
ON Fournisseur
FOR DELETE
AS
DELETE from Articles
WHERE NumArticle = (SELECT NumArticle FROM deleted)
SGBDR - Chapitre 7
Page 7 sur 7
2005-2006