• Aucun résultat trouvé

LES DÉCLENCHEURS (triggers)

Dans le document BASES DE DONNÉES ET MODÈLES DE CALCUL (Page 146-151)

SQL avancé

6.6 LES DÉCLENCHEURS (triggers)

Un trigger est un mécanisme constitué d'une section de code accompagnée des conditions qui entraînent son exécution. Sa forme générale est la suivante :

before/after E when C

begin A end

et s'interprète de la manière suivante : dès qu’un événement E survient, si la condi-tion C est satisfaite, alors exécuter l'action A soit avant (before) soit après (after) E. De cette forme découle le nom de mécanisme E-C-A (événement-condition-action). On considère quatre types d'événements : insertion d'une ligne, suppression d'une ligne, modification d'une ligne (toutes colonnes confondues) et modification d'une colonne d'une ligne.

14. Cette procédure, ainsi que les déclencheurs de la section suivante sont rédigés dans une syntaxe fictive proche de celle de PL/SQL d’Oracle ou du langage d’InterBase. On notera que l’usage d’un argument est préfixé de ":" afin d’éviter toute ambiguïté avec un nom de colonne.

6.7 Le catalogue 147

© Dunod – La photocopie non autorisée est un délit.

L'exemple ci-dessous définit la modification automatique de la valeur de CAT lorsque l'état du compte d'un client descend en dessous d'un certain seuil.

create trigger MAJ_CLI

before update of COMPTE on CLIENT for each row

when (new.COMPTE < -10000) begin

if old.CAT = 'B2'

then new.CAT := 'B1';

end if;

if old.CAT = 'C2'

then new.CAT := 'C1';

end if;

end;

Le trigger porte le nom de MAJ_CLI. L'événement déclencheur est la modification de la colonne COMPTE de CLIENT (updateofCOMPTEonCLIENT). Pour chaque ligne ainsi modifiée (foreachrow), et si la nouvelle valeur de COMPTE est infé-rieure à -10.000 (when new.COMPTE < -10000), alors, avant la modification (beforeupdate), les valeurs de CAT sont rétrogradées de B2 en B1 et de C2 en C1. Dans cette interprétation, old et new désignent respectivement les états de la ligne en cours de modification avant et après la modification (update). En cas de création (insert), seule la version new existe, tandis que pour une suppression (delete), seule la version old est accessible. L'expression new.COMPTE désigne donc la nouvelle valeur de COMPTE de la ligne courante. L'assignation new.CAT :='B1' permet de modifier les valeurs de CAT avant l'enregistrement.

Remarque

La forme générale E-C-A peut être simplifiée, sans perte de généralité, comme suit : before/after E

begin

if C then A end if end

C’est d’ailleurs la seule forme admise par certains SGBD, tels que Firebird.

6.7 LE CATALOGUE

L’environnement des bases de données SQL comporte, outre les tables créées par ses utilisateurs, une collection de tables dont le contenu décrit les structures de cette base. Ces tables constituent le dictionnaire des données ou encore le catalogue du système.

a) Principes d'un dictionnaire de données

Tout SGBD relationnel gère, outre les tables définies par les utilisateurs, un ensemble de tables standard dont le contenu décrit tous les objets qui ont été déclarés par les utilisateurs et l’administrateur15 de la base de données. En particulier, ces tables permettent de savoir quelles tables ont été définies et renseignent sur la définition de leurs colonnes, des index, des privilèges (y compris les mots de passe), les utilisateurs eux-mêmes ainsi que les programmes qui utilisent la base de données.

Ces informations étant rangées dans des tables SQL ordinaires, il est possible à l'utilisateur qui en a l'autorisation de consulter leur contenu.

Ces tables constituent ce qu'on appelle un dictionnaire de données. Elles sont utilisées par le SGBD SQL, qui peut ainsi vérifier la validité des requêtes, les traduire en algorithmes efficaces et les exécuter. Ces tables seront également utili-sées lors de l'exécution d'un programme, afin de vérifier que la structure de la base de données n'a pas été modifiée depuis la compilation du programme (et, le cas échéant, recompiler automatiquement le programme) et d'effectuer un contrôle d’accès.

b) Les tables du catalogue

Le dictionnaire de données que nous venons de décrire, ou catalogue du système, contient plusieurs dizaines de tables, dont le nombre, le nom, la composition et l'interprétation sont susceptibles de varier selon les SGBD et selon les versions.

Les deux tables les plus importantes sont certainement la table des tables et la table des colonnes. La première (que nous appellerons SYS_TABLE) nous renseigne sur les tables qui constituent la base de données tandis que la seconde (SYS_COLUMN) décrit leurs colonnes (figure 6.1). Nous décrirons brièvement la composition de ces deux tables16.

Chaque ligne de SYS_TABLE décrit une des tables de la base de données. Elle en spécifie le nom (TNAME), le créateur et propriétaire (CREATOR) et le type (TTYPE), qui est réel (R) ou vue (V).

La table SYS_COLUMN indique pour chaque colonne de la base de données le nom de sa table (TNAME), son propre nom (CNAME), le type de ses valeurs (CTYPE), leur longueur (LEN1), le nombre de décimales (LEN2) ainsi que son caractère obligatoire (NULLS = N) ou facultatif (NULLS = Y). Ces tables comportent d'autres colonnes qui ne présentent pas d'intérêt dans une présentation introductive.

On observera que ces deux tables décrivent non seulement les tables et colonnes des utilisateurs, mais aussi celles du catalogue (y compris SYS_TABLE et 15. Un administrateur d’une base de données destinée à desservir une communauté d’utilisateurs est le responsable de la création, du bon fonctionnement de la base de données et de la qualité des données. C’est lui qui est chargé, entre autres choses, de la gestion des privilèges et de l’évolu-tion de la base de données.

16. Le script de création des quatre tables du catalogue en InterBase est disponible sur le site de l’ouvrage. Ce catalogue est évidemment fictif.

6.7 Le catalogue 149

© Dunod – La photocopie non autorisée est un délit.

SYS_COLUMN elles-mêmes ainsi que leurs colonnes), dont le créateur est par convention SYSTEM.

Figure 6.1 - Les deux tables principales du catalogue : la table des tables et la table des colonnes

La représentation des identifiants et clés étrangères est un peu plus complexe17. La table SYS_KEY représente les clés et leurs relations, tandis que la table SYS_KEY_COMP décrit leurs composants. Chaque ligne de SYS_KEY décrit un identifiant primaire (KTYPE = P) ou une clé étrangère (KTYPE = F). Elle donne pour chacune son code interne qui permet de la distinguer (KEYID), sa table (TNAME), son type (KTYPE) et, pour les clés étrangères, le code de l’identifiant correspondant dans la table cible (KTARG).

Chaque ligne de la table SYS_KEY_COMP représente un composant d’une clé.

Elle reprend le code de la clé, le nom de la colonne et son numéro d’ordre.

D'autres tables précisent la définition de chaque vue, décrivent les contraintes, les triggers et les procédures, répertorient les utilisateurs, définissent les privilèges, décrivent les index et espaces de stockage ainsi que leur mode et paramètres d'implémentation, décrivent les programmes d'application, et contiennent des statis-tiques sur les données. Il existe enfin des tables qui contiennent des données propres au SGBD, et qui sont sans signification pour l'utilisateur.

17. D'autant plus que, pour des raisons de performances, les représentations effectivement adop-tées dans les SGBD sont fortement optimisées, et donc différentes de celle qui est discutée ici.

L’exercice 6.3 aborde cette question.

Figure 6.2 - Deux tables du catalogue représentant les identifiants primaires, les clés étrangères, leurs composants et leurs relations

c) Utilisation du catalogue

Il apparaît immédiatement que le contenu des tables du catalogue ne peut être modifié comme pourrait l'être celui des tables ordinaires. En effet, toute modifica-tion intempestive de ces données entraînerait de graves conséquence sur le foncmodifica-tion- fonction-nement de la base de données. Par exemple, supprimer une ligne de la table SYS_TABLE rend inaccessible la table que cette ligne décrit. En principe, le contenu des tables du catalogue ne peut être modifié que par le système de gestion lui-même lorsqu'il exécute une requête telle que create table, create index, droptable, altertable, createview, grant, revoke, etc. En revanche, ces données peuvent être consultées par tout utilisateur qui en a reçu l'autorisation.

Nous donnerons ci-après quelques exemples de requêtes représentatives. D’autres traitements, plus complexes, seront décrits en 7.5.4.

• Quelles sont les colonnes de la table DETAIL ? select CNAME, CTYPE, LEN1, NULLS from SYS_COLUMN

where TNAME = 'DETAIL'

• Dans quelles tables de base existe-t-il des colonnes dont le nom commence par 'NCOM' ?

select TNAME from SYS_TABLE

where TNAME in (select TNAME from SYS_COLUMN

where CNAME like 'NCOM%') and TTYPE = 'R'

CNAME CTYPE LEN1 NULLS NCOM

NPRO QCOM

CHAR CHAR DECIMAL

12 15 8

N N N

Dans le document BASES DE DONNÉES ET MODÈLES DE CALCUL (Page 146-151)