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