Création de schémas

Retrouvez dans cette partie toutes les explications sur les différentes méthodes qui permettent de créer un schéma, aussi bien un schéma inactif[1] pré-enregistré dans la table de gestion[2] d'ASGARD qu'un tout nouveau schéma.

Remarque

Quel que soit le mode de création envisagé, le rôle de l'utilisateur doit disposer du privilège CREATE sur la base, directement ou par héritage d'un rôle de groupe dont il est membre.

C'est nativement le cas de g_admin[3] et des rôles super-utilisateurs. Pour les autres rôles, ce privilège devra être conféré explicitement par l'administrateur.

Activation de schémas de la nomenclature nationale

CREATE SCHEMA %nom_schema AUTHORIZATION %producteur ;

ou

UPDATE z_asgard.gestion_schema_usr SET creation = True WHERE nom_schema = '%nom_schema' ;

Un des intérêts d’ASGARD est de permettre l’import de la nomenclature nationale[4] dans sa table de gestion[2], ce qui représente à ce jour une centaine de schémas du bloc[5] « consultation ». Par défaut, leur producteur[6] est g_admin[3] – seuls les administrateurs peuvent ajouter des objets dans ces schémas – et leur lecteur[7] g_consult[9] – tous les membres de g_consult, donc en principe tous les utilisateurs, ont accès en lecture à ces schémas, y compris le rôle de connexion[8] générique consult.defaut[10]. Ces valeurs sont pleinement modifiables.

Pour travailler sur les schémas de la nomenclature nationale, il faut d’abord les importer dans la table de gestion.

Par la suite, pour créer effectivement les schémas, il suffit de basculer leur champ creation à True dans la vue utilisateur z_asgard.gestion_schema_usr.

Exemple

Pour créer le schéma c_air_clim_changement de la nomenclature :

1
2
UPDATE z_asgard.gestion_schema_usr
3
    SET creation = True
4
    WHERE nom_schema = 'c_air_clim_changement' ;

Il est également possible de les créer par une commande SQL CREATE SCHEMA classique.

Exemple

Méthode alternative pour créer le schéma c_air_clim_changement :

1
2
CREATE SCHEMA c_air_clim_changement ; 

ASGARD intercepte la commande et, repérant que le schéma qui vient d’être créé est enregistré dans la table de gestion, met à jour l’enregistrement correspondant – creation passe à True. Les privilèges du schéma seront en retour modifiés selon les prescriptions de la table de gestion pour les fonctions d’éditeur[11] et de lecteur[7]. Le producteur est pour sa part mis à jour dans la table de gestion en fonction du propriétaire du schéma qui vient d’être créé, c’est-à-dire l’utilisateur courant ou le rôle spécifié par la clause AUTHORIZATION.

Attention

On rappelle qu’ASGARD interdit qu’un rôle de connexion soit producteur.

Exemple

Le rôle de connexion jon.snow dispose des permissions nécessaires pour créer des schémas. Mais s’il lance une commande CREATE SCHEMA sans plus de précaution, ASGARD lui retourne une erreur :

1
2
CREATE SCHEMA c_air_clim_changement ; 
1
2
ERREUR: ECS0 > TA0 > TA3. Opération interdite (schéma c_air_clim_changement). Le producteur/propriétaire du schéma ne doit pas être un rôle de connexion.

Il devra préciser un propriétaire pour le schéma qui soit un rôle de groupe[12] dont il est membre :

1
2
-- en spécifiant le rôle dans la commande de création :
3
CREATE SCHEMA c_air_clim_changement AUTHORIZATION g_snum ;
4
5
-- ou, en endossant le rôle au préalable :
6
SET ROLE g_snum ;
7
CREATE SCHEMA c_air_clim_changement ;

ASGARD retourne alors :

1
2
NOTICE: application des privilèges standards pour le rôle lecteur du schéma c_air_clim_changement :
3
NOTICE: > GRANT USAGE ON SCHEMA c_air_clim_changement TO g_consult
4
NOTICE: > GRANT SELECT ON ALL TABLES IN SCHEMA c_air_clim_changement TO g_consult
5
NOTICE: > GRANT SELECT ON ALL SEQUENCES IN SCHEMA c_air_clim_changement TO g_consult
6
NOTICE: ... Le schéma c_air_clim_changement apparaît désormais comme "créé" dans la table de gestion.
7
CREATE SCHEMA

Dans la table de gestion, l’attribut creation du schéma est passé à True, les droits du rôle lecteur (ici g_consult, valeur par défaut renseignée lors de l’import de la nomenclature) sont appliqués et le producteur du schéma c_air_clim_changement (pré-renseigné à g_admin lors de l’import de la nomenclature) devient g_snum.

On peut constater que le groupe g_consult détient bien le privilège USAGE sur le schéma :

Dans cet exemple, les commandes notifiées portant sur les objets n’ont pas d’effet, puisque le schéma est encore vide. Elles sont par contre utiles lorsque des objets sont créés simultanément au schéma, avec une commande telle que :

1
2
CREATE SCHEMA c_air_clim_changement AUTHORIZATION g_snum
3
    CREATE TABLE temperature (id serial, jour date, valeur numeric) ;

Activation d'un sous-ensemble de schémas de la nomenclature nationale

UPDATE z_asgard.gestion_schema_usr SET creation = True WHERE ... ;

Pour activer plusieurs schémas, on peut bien sûr, schéma par schéma, passer l’attribut creation à True dans la vue utilisateur, ou lancer autant de requête SQL CREATE SCHEMA. Mais si les schémas considérés ont une caractéristique commune, telle que l’appartenance à un même domaine – champ niv1 – ou un même sous-domaine – champ niv2 –, la création multiple pourra être réalisée avec une seule commande SQL.

Exemple

Création de tous les schémas du domaine « Eau » :

1
2
UPDATE z_asgard.gestion_schema_usr
3
    SET creation = True
4
    WHERE niv1 = 'Eau' ;

ASGARD renvoie une succession de messages indiquant que les schémas ont bien été créés et les privilèges pré-définis appliqués.

1
2
NOTICE: ... Le schéma c_eau_aep a été créé.
3
NOTICE: application des privilèges standards pour le rôle lecteur du schéma c_eau_aep :
4
NOTICE: > GRANT USAGE ON SCHEMA c_eau_aep TO g_consult
5
NOTICE: > GRANT SELECT ON ALL TABLES IN SCHEMA c_eau_aep TO g_consult
6
NOTICE: > GRANT SELECT ON ALL SEQUENCES IN SCHEMA c_eau_aep TO g_consult

… et de même pour chaque schéma.

Exemple

Création massive de tous les schémas de la nomenclature nationale :

1
2
UPDATE z_asgard.gestion_schema_usr
3
    SET creation = True
4
    WHERE nomenclature ;

Création de nouveaux schémas

Schéma actif

CREATE SCHEMA %nom_schema AUTHORIZATION %producteur ;

ou

INSERT INTO z_asgard.gestion_schema_usr (nom_schema, producteur, creation [, ...] ) VALUES ('%nom_schema', '%producteur', True [, ...] ) ;

Schéma inactif

INSERT INTO z_asgard.gestion_schema_usr (nom_schema, producteur [, ...] ) VALUES ('%nom_schema', '%producteur' [, ...] ) ;

ASGARD permet de créer un nouveau schéma en ajoutant un enregistrement dans la vue utilisateur z_asgard.gestion_schema_usr, par commande INSERT ou toute méthode permettant la saisie d'une nouvelle ligne.

Les seuls champs obligatoires sont nom_schema[13] et producteur[14], les autres pouvant être remplis au moment de l'insertion de l'enregistrement, ultérieurement ou jamais. Cf. Champs de la table de gestion pour leur description.

Si le champ creation[15] n’est pas renseigné, il sera considéré comme valant False et le schéma sera référencé dans la table de gestion[2] sans être créé[1]. Pour procéder à sa création effective, il faudra ultérieurement basculer creation sur True.

Si creation vaut True lors de l’ajout de l’enregistrement, le schéma est immédiatement créé.

Exemple

Création d'un schéma en passant par la vue z_asgard.gestion_schema_usr :

1
2
INSERT INTO z_asgard.gestion_schema_usr
3
    (nom_schema, creation, producteur) VALUES
4
    ('w_snow', true, 'g_snum') ;
1
2
NOTICE: [table de gestion] Mise à jour du bloc pour le schéma w_snow (w).
3
NOTICE: ... Le schéma w_snow a été créé.
4
INSERT 0 1

Le producteur[6] doit nécessairement être un rôle de groupe[12] (cf. description du champ producteur pour plus d'informations). Ainsi jon.snow (rôle de connexion[8]) ne peut indiquer « jon.snow » dans le champ producteur.

Toutes les méthodes classiques de création de schémas restent en outre pleinement utilisables dans le contexte d’ASGARD. Le nouveau schéma est alors enregistré dans la table de gestion avec comme producteur le rôle défini comme propriétaire par la commande de création.

Exemple

Création par une commande CREATE SCHEMA :

1
2
CREATE SCHEMA w_snow AUTHORIZATION g_snum ;
1
2
NOTICE: [table de gestion] Mise à jour du bloc pour le schéma w_snow (w).
3
NOTICE: ... Le schéma w_snow a été enregistré dans la table de gestion.
4
CREATE SCHEMA

ASGARD met alors à jour la table de gestion.

(les champs niv1, niv1_abr, niv2, niv2_abr, non représentés ci-avant, sont NULL)

ASGARD déduit le champ bloc (ici « w ») du nom du schéma, dès lors que celui-ci commence par une lettre – qui deviendra son bloc[5] – suivie d’un tiret bas. Cf. Mécanismes de mise en cohérence des champs bloc et nom_schema pour le détail de ce mécanisme.

Une commande SQL CREATE SCHEMA … AUTHORIZATION %role échoue si le rôle spécifié n’existe pas. Par contre, si l’opérateur crée son schéma par insertion dans la vue utilisateur avec un rôle producteur (mais aussi éditeur ou lecteur) non existant et que creation vaut True, alors ASGARD tente de créer le rôle manquant. Il est évidemment nécessaire que l’utilisateur courant soit habilité à créer des rôles.