
La même expression régulière pour vérifier les e-mails, recopiée dans plusieurs tables. Un jour, quelqu’un corrige l’une d’elles et les autres restent comme avant. Autre scénario, on oublie de mettre une contrainte check sur une colonne et un montant négatif est accepté en contradiction avec une règle métier. Nous avons tous déjà passé par ces scénarios.
Avec Oracle 23ai, nous écrivons la règle une seule fois, dans un domaine, et nous l’appliquons à toutes les colonnes concernées. Pour les annotations elles nous permettent de décrire et documenter dans la base ce que contient une colonne : donnée personnelle, propriétaire, durée de conservation (les annotations sont aussi disponible dans la version 19.28).
Préparons notre environnement de test
Pour nos exemples il nous faut une base 23ai ou 26ai.
Nous créons le compte qui va posséder notre petit inventaire de serveurs et de bases. Le privilège CREATE DOMAIN est déjà inclus dans certains rôles, mais nous préférons l’accorder nous-mêmes :
CREATE USER inventaire IDENTIFIED BY "xxxxxxxxxx" QUOTA UNLIMITED ON users;
GRANT CREATE SESSION, CREATE TABLE, CREATE DOMAIN TO inventaire;Langage du code : JavaScript (javascript)1.Création de domaines
Connectés en tant que inventaire, nous créons trois domaines : un nom de serveur valide, un environnement limité à trois valeurs, et une taille qui ne peut pas être négative.
CREATE DOMAIN hote_d AS VARCHAR2(63)
CONSTRAINT hote_chk CHECK (REGEXP_LIKE (hote_d, '^[A-Za-z][A-Za-z0-9-]{1,62}$'))
DISPLAY LOWER(hote_d)
ORDER LOWER(hote_d);
CREATE DOMAIN environnement_d AS VARCHAR2(10)
DEFAULT ON NULL 'TEST'
CONSTRAINT env_chk CHECK (environnement_d IN ('PROD', 'PREPROD', 'TEST'));
CREATE DOMAIN taille_go_d AS NUMBER(8,2)
CONSTRAINT taille_positive CHECK (taille_go_d >= 0);Langage du code : PHP (php)Un domaine réunit au même endroit le type de données, la contrainte, et si on veut une valeur par défaut, une façon d’afficher (DISPLAY) et une façon de trier (ORDER). Oracle fournit aussi des domaines tout prêts, comme email_d ou credit_card_number_d. Avant d’en créer un, nous vérifions donc s’il n’existe pas déjà.
Pour rattacher une colonne à un domaine, nous l’écrivons à la place du type, ou juste après. Sans type précisé, la colonne prend celui du domaine :
CREATE TABLE serveurs (
id_serveur NUMBER PRIMARY KEY,
hote hote_d NOT NULL,
environnement environnement_d
);
CREATE TABLE bases (
id_base NUMBER PRIMARY KEY,
nom_base VARCHAR2(30) NOT NULL,
id_serveur NUMBER NOT NULL,
taille_go taille_go_d NOT NULL
);Langage du code : PHP (php)Testons avec des données correctes, puis incorrectes :
INSERT INTO serveurs VALUES (1, 'SRVDB01', 'PROD');
INSERT INTO serveurs VALUES (2, 'srvdb02', 'PREPROD');
INSERT INTO serveurs (id_serveur, hote) VALUES (3, 'SRVDB03');
INSERT INTO bases VALUES (1, 'FACTURATION', 1, 450);
INSERT INTO serveurs VALUES (4, 'srv db', 'PROD');
INSERT INTO serveurs VALUES (5, 'SRVDB05', 'PRODUCTION');
INSERT INTO bases VALUES (2, 'ARCHIVES', 1, -10);Langage du code : JavaScript (javascript)Les quatre premières lignes passent. Pour le troisième serveur, nous n’avons pas donné d’environnement : le domaine met TEST tout seul. Les trois dernières sont refusées, avec une erreur de ce type :
SQL> INSERT INTO serveurs VALUES (4, 'srv db', 'PROD');
*INSERT INTO serveurs VALUES (4, 'srv db', 'PROD')
*
ERREUR a la ligne 1 :
ORA-11534: violation de la contrainte de verification (SYS.SYS_C008624)
impliquant column HOTE en raison de la contrainte de domaine SYS.HOTE_CHK du
domaine SYS.HOTE_D
Help: https://docs.oracle.com/error-help/db/ora-11534/
Langage du code : JavaScript (javascript)Si une règle change un jour, nous la modifions à un seul endroit, au niveau de domaine.
2.Affichage, tri et dictionnaire
Le domaine hote_d contient deux règles en plus de la contrainte : DISPLAY pour afficher en minuscules, et ORDER pour trier en minuscules. Elles ne changent jamais les données enregistrées, et elles ne s’appliquent que si nous les appelons, avec les fonctions DOMAIN_DISPLAY et DOMAIN_ORDER.
L’affichage. Nos noms sont saisis tantôt en majuscules, tantôt en minuscules. DOMAIN_DISPLAY les présente tous de la même façon :
SELECT domain_display(hote) AS hote_affiche
FROM serveurs
ORDER BY id_serveur;
HOTE_AFFICHE
--------------------
srvdb01
srvdb02
srvdb03Langage du code : PHP (php)Le tri. Avec le tri binaire, le réglage courant, Oracle place les majuscules avant les minuscules. Un ORDER BY hote donne donc SRVDB01, SRVDB03, puis srvdb02. DOMAIN_ORDER applique la règle du domaine, un tri sans tenir compte de la casse :
SELECT hote
FROM serveurs
ORDER BY domain_order(hote);
HOTE
--------------------
SRVDB01
srvdb02
SRVDB03
Le dictionnaire. Avant de modifier un domaine, une question s’impose : quelles colonnes l’utilisent ? La vue USER_TAB_COLUMNS a deux nouvelles colonnes pour ça, DOMAIN_OWNER et DOMAIN_NAME :
SELECT table_name, column_name, domain_name
FROM user_tab_columns
WHERE domain_name IS NOT NULL
ORDER BY table_name, column_name;
Langage du code : PHP (php)Pour lire la définition des domaines eux-mêmes, il y a USER_DOMAINS, USER_DOMAIN_COLS et USER_DOMAIN_CONSTRAINTS.
3. Les annotations
Une annotation, c’est une étiquette avec un nom et une valeur, que nous collons sur une table ou une colonne. C’est un commentaire plus structuré. Les noms et les valeurs sont libres, la base n’en fait rien, ce sont nos équipes et nos outils qui les lisent.
Nous notons le propriétaire de l’inventaire, l’unité de la taille, le format des noms de serveurs et la politique de sauvegarde :
ALTER TABLE serveurs ANNOTATIONS (Proprietaire 'Équipe infrastructure');
ALTER TABLE serveurs MODIFY (hote ANNOTATIONS (Format 'Nom court, sans domaine'));
ALTER TABLE bases MODIFY (taille_go ANNOTATIONS (Unite 'Go'));
ALTER TABLE bases ANNOTATIONS (Sauvegarde 'Quotidienne', Retention '30 jours');Langage du code : JavaScript (javascript)Pour tout relire, une seule vue suffit :
SELECT object_name, object_type, column_name, annotation_name, annotation_value
FROM user_annotations_usage
ORDER BY object_name, column_name, annotation_name;
Poster un Commentaire