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⚓
n_schema
est une chaîne de caractères correspondant au nom d’un schéma présumé existant. Les valeurs den_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"'.[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 valeurTrue
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éfautFalse
, 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) ;[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…
SELECT z_asgard.asgard_initialise_schema('c_bibliotheque') ;
NOTICE: [table de gestion] Mise à jour du bloc pour le schéma c_bibliotheque (c).
NOTICE: (schéma c_bibliotheque pré-existant)
NOTICE: attribution de la propriété des objets au rôle producteur du schéma c_bibliotheque :
NOTICE: > ALTER TABLE c_bibliotheque.journal_du_mur OWNER TO g_admin
NOTICE: > ALTER SEQUENCE c_bibliotheque.journal_du_mur_id_seq OWNER TO g_admin
NOTICE: ... Le schéma c_bibliotheque a été enregistré dans la table de gestion.
NOTICE: remise à zéro des privilèges manuels du pseudo-rôle public :
NOTICE: > néant
NOTICE: remise à zéro des privilèges des autres rôles (pour le producteur, les éventuels privilèges manquants sont réattribués) :
NOTICE: > REVOKE USAGE ON SCHEMA c_bibliotheque FROM "jon.snow"
NOTICE: > REVOKE SELECT ON TABLE c_bibliotheque.journal_du_mur FROM "jon.snow"
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 :
SELECT z_asgard.asgard_initialise_schema('c_bibliotheque', b_preserve := True) ;
NOTICE: [table de gestion] Mise à jour du bloc pour le schéma c_bibliotheque (c).
NOTICE: (schéma c_bibliotheque pré-existant)
NOTICE: attribution de la propriété des objets au rôle producteur du schéma c_bibliotheque :
NOTICE: > ALTER TABLE c_bibliotheque.journal_du_mur OWNER TO g_admin
NOTICE: > ALTER SEQUENCE c_bibliotheque.journal_du_mur_id_seq OWNER TO g_admin
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).
SELECT z_asgard.asgard_initialise_schema('w_snow') ;
NOTICE: (ré)attribution de la propriété des objets au rôle producteur du schéma :
NOTICE: > néant
NOTICE: remise à zéro des privilèges manuels du pseudo-rôle public :
NOTICE: > néant
NOTICE: remise à zéro des privilèges des autres rôles (pour le producteur, les éventuels privilèges manquants sont réattribués) :
NOTICE: > REVOKE USAGE ON SCHEMA w_snow FROM "jon.snow"
NOTICE: > REVOKE SELECT ON TABLE w_snow.journal_du_mur FROM "jon.snow"
NOTICE: > REVOKE INSERT ON TABLE w_snow.journal_du_mur FROM "jon.snow"