asgard_initialise_schema

fonction de référencement et/ou de réinitialisation des droits selon le standard d'ASGARD (cible = un schéma donné en argument)

z_asgard.asgard_initialise_schema(n_schema text [, b_preserve boolean DEFAULT False [, b_gs boolean DEFAULT False ]] )

La fonction asgard_initialise_schema permet de réinitialiser les droits sur un schéma et son contenu. Pour les rôles producteur[1], éditeur[2] et lecteur[3] désignés dans la table de gestion[4], elle revient aux privilèges standards. Les privilèges des autres rôles sont effacés (hors privilèges implicites du pseudo-rôle public – USAGE sur les fonctions et les types)., ainsi que les privilèges par défaut définis sur le schéma considéré par la commande ALTER DEFAULT PRIVILEGES.

Si elle est appliquée à un schéma existant non référencé dans la table de gestion, elle le référence[5] (cf. paramètre b_gs pour le choix du producteur et b_preserve pour la conservation ou non des privilèges pré-définis). Le producteur du schéma deviendra également propriétaire de tous les objets qu’il contient, s’il ne l’était pas déjà.

La fonction échoue si le schéma donné en argument n’existe pas.

Lorsqu’elle est appliquée aux schémas z_asgard et z_asgard_admin, asgard_initialise_schema préserve les privilèges de g_admin_ext et g_consult nécessaires au bon fonctionnement d'ASGARD (très précisément, elle le supprime pour les restaure). Elle peut également être utilisée pour les rétablir en cas de suppression accidentelle, mais la fonction asgard_initialise_all_schemas (variante n°2) sera plus efficace pour les situations vraiment critiques.

Schéma

z_asgard

Remarque

Si le schéma visé est déjà référencé, la fonction peut être utilisée par tout utilisateur membre de son rôle producteur.

Dans le cas contraire, l'utilisateur doit :

  • disposer du privilège CREATE sur la base ;

  • être membre du rôle propriétaire du schéma, ainsi que du rôle propriétaire de chaque objet rattaché au schéma (potentiellement plusieurs rôles différents et distincts du propriétaire du schéma).

Cf. Déléguer la gestion des droits pour plus de précisions.

g_admin remplit toujours la première condition, mais il pourra être nécessaire d'ajouter manuellement des permissions pour la seconde, selon les messages d'erreur renvoyés.

Syntaxe avec des arguments positionnels

SELECT z_asgard.asgard_initialise_schema('%n_schema' [, %b_preserve [, %b_gs ]] ) ;

Les arguments doivent être spécifiés dans l’ordre.

Les arguments optionnels peuvent être omis, mais seulement s’ils sont à la fin de la liste.

Syntaxe avec des arguments nommés

SELECT z_asgard.asgard_initialise_schema(n_schema := '%n_schema' [, b_preserve := %b_preserve [, b_gs := %b_gs ]] ) ;

L’ordre des arguments nommés n’a pas d’importance.

Les arguments optionnels peuvent être omis.

Il est bien entendu possible de commencer avec des arguments positionnels (dans l’ordre) et terminer par des arguments nommés.

Arguments

  1. n_schema est une chaîne de caractères correspondant au nom d’un schéma présumé existant. Les valeurs de n_schema s’écrivent sans les guillemets doubles nécessaires aux identifiants des commandes SQL, même s’il s’agit de noms non normalisés. Par exemple, on veillera bien à indiquer 'c_Bibliothèque' et non '"c_Bibliothèque"'.

  2. [optionnel] b_preserve est un paramètre booléen. Pour un schéma encore non référencé (ou pré-référencé comme inactif[6] sans que le lien ait encore été établi avec le schéma actif[7] de même nom) dans la table de gestion, une valeur True signifie que les privilèges des rôles lecteur et éditeur doivent être ajoutés par-dessus les droits actuels. Avec la valeur par défaut False, les privilèges sont réinitialisés. Ce paramètre est ignoré pour un schéma déjà référencé (et les privilèges sont réinitialisés) ;

  3. [optionnel] b_gs est un booléen indiquant si, dans l’hypothèse où le schéma serait déjà référencé mais marqué comme inactif dans la table de gestion, c’est le propriétaire du schéma qui doit devenir le producteur (False) ou le producteur pré-renseigné dans la table de gestion qui doit devenir le propriétaire du schéma (True). False par défaut. Ce paramètre est ignoré pour un schéma déjà référencé comme actif.

Résultat

« __ REINITIALISATION REUSSIE. », ou « __ INITIALISATION REUSSIE. » pour un schéma non référencé comme créé et pour lequel l'argument b_preserve vaut True.

Exemple

Utilisation d’asgard_initialise_schema pour référencer un schéma pré-existant dans la table de gestion, en l’occurrence c_bibliotheque.

Si on lance la fonction sans argument optionnel…

1
2
SELECT z_asgard.asgard_initialise_schema('c_bibliotheque') ;
1
2
NOTICE:  [table de gestion] Mise à jour du bloc pour le schéma c_bibliotheque (c).
3
NOTICE:  (schéma c_bibliotheque pré-existant)
4
NOTICE:  attribution de la propriété des objets au rôle producteur du schéma c_bibliotheque :
5
NOTICE:  > ALTER TABLE c_bibliotheque.journal_du_mur OWNER TO g_admin
6
NOTICE:  > ALTER SEQUENCE c_bibliotheque.journal_du_mur_id_seq OWNER TO g_admin
7
NOTICE:  ... Le schéma c_bibliotheque a été enregistré dans la table de gestion.
8
NOTICE:  remise à zéro des privilèges manuels du pseudo-rôle public :
9
NOTICE:  > néant
10
NOTICE:  remise à zéro des privilèges des autres rôles (pour le producteur, les éventuels privilèges manquants sont réattribués) :
11
NOTICE:  > REVOKE USAGE ON SCHEMA c_bibliotheque FROM "jon.snow"
12
NOTICE:  > REVOKE SELECT ON TABLE c_bibliotheque.journal_du_mur FROM "jon.snow"
13
NOTICE:  > REVOKE INSERT ON TABLE c_bibliotheque.journal_du_mur FROM "jon.snow"

… on constate que les privilèges de jon.snow ont été révoqués, ce qui n’est peut-être pas souhaitable. Dans ce cas, il aurait été préférable de spécifier dès le départ que les privilèges pré-existants devaient être conservés :

1
2
SELECT z_asgard.asgard_initialise_schema('c_bibliotheque', b_preserve := True) ;
1
2
NOTICE: [table de gestion] Mise à jour du bloc pour le schéma c_bibliotheque (c).
3
NOTICE: (schéma c_bibliotheque pré-existant)
4
NOTICE: attribution de la propriété des objets au rôle producteur du schéma c_bibliotheque :
5
NOTICE:  > ALTER TABLE c_bibliotheque.journal_du_mur OWNER TO g_admin
6
NOTICE:  > ALTER SEQUENCE c_bibliotheque.journal_du_mur_id_seq OWNER TO g_admin
7
NOTICE: ... Le schéma c_bibliotheque a été enregistré dans la table de gestion.

Exemple

Utilisation d’asgard_initialise_schema pour effacer des modifications manuelles de privilèges sur un schéma déjà référencé. Dans cet exemple, on considère le schéma w_snow, sur lequel des droits avaient été accordés au rôle de connexion jon.snow sans qu’il soit identifié ni comme lecteur, ni comme éditeur (et il n’y a d’ailleurs ni lecteur ni éditeur désigné pour ce schéma).

1
2
SELECT z_asgard.asgard_initialise_schema('w_snow') ;
1
2
NOTICE: (ré)attribution de la propriété des objets au rôle producteur du schéma :
3
NOTICE: > néant
4
NOTICE: remise à zéro des privilèges manuels du pseudo-rôle public :
5
NOTICE: > néant
6
NOTICE: remise à zéro des privilèges des autres rôles (pour le producteur, les éventuels privilèges manquants sont réattribués) :
7
NOTICE: > REVOKE USAGE ON SCHEMA w_snow FROM "jon.snow"
8
NOTICE: > REVOKE SELECT ON TABLE w_snow.journal_du_mur FROM "jon.snow"
9
NOTICE: > REVOKE INSERT ON TABLE w_snow.journal_du_mur FROM "jon.snow"