asgard_reaffecte_role
fonction de suppression ou transfert à un autre rôle de tous les privilèges d'un rôle sur les objets d'une base
z_asgard_admin.asgard_reaffecte_role(n_role text [, n_role_cible text DEFAULT NULL::text [, b_hors_asgard boolean DEFAULT False [, b_privileges boolean DEFAULT True [, b_default_acl boolean DEFAULT False ]]]] )
asgard_reaffecte_role
transfère les droits sur les objets d’un rôle à un autre, incluant s’il y a lieu ses fonctions de producteur[1], éditeur[2] et lecteur[3]. Si aucun rôle cible n’est spécifié, les privilèges sont simplement supprimés et, le cas échéant, g_admin
reçoit la propriété des objets.
Il peut être nécessaire d’exécuter cette fonction en tant que super-utilisateur[4] si certains droits ont été conférés par un super-utilisateur et/ou portent sur des objets appartenant à un super-utilisateur.
Selon le paramétrage, la fonction peut viser uniquement les objets des schémas référencés par ASGARD[5] ou la totalité des objets de la base, y compris les objets partagés entre les bases (bases, tablespaces). Elle peut également être paramétrée :
pour transférer la propriété des objets à un rôle déterminé, mais pas les privilèges non liés à la propriété (indépendamment de la question des privilèges par défaut, qui sont exclusivement gérés par le paramètre
b_default_acl
) ;pour s’appliquer sur les privilèges par défaut (définis par
ALTER DEFAULT PRIVILEGES
), en plus des privilèges effectifs sur les objets.
asgard_reaffecte_role
n’a aucune action sur les permissions dont disposerait le rôle sur d’autres rôles ou inversement.
Le pseudo-rôle public
n’est pas reconnu par cette fonction.
asgard_reaffecte_role
est notamment utile pour préparer la suppression d’un rôle, dans la mesure où celle-ci n’est possible qu’à partir du moment où le rôle ne dispose plus d’aucun privilège sur les objets d’aucune base.
Remarque :
Pour supprimer tous les privilèges d'un rôle, la fonction doit être exécutée sur toutes les bases où il avait des droits, en supposant que l'extension ASGARD soit installée sur chacune d'elles. À noter que la fonction renvoie la liste des bases restant à traiter, il n'est donc pas utile d'identifier toutes les bases concernées au préalable.
Syntaxe avec des arguments positionnels⚓
SELECT z_asgard_admin.asgard_reaffecte_role('%n_role' [, '%n_role_cible' [, %b_hors_asgard [, %b_privileges [, %b_default_acl ]]]] ) ;
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_admin.asgard_reaffecte_role(n_role := '%n_role' [, n_role_cible := '%n_role_cible' [, b_hors_asgard := %b_hors_asgard [, b_privileges := %b_privileges [, b_default_acl := %b_default_acl ]]]] ) ;
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_role
est une chaîne de caractères correspondant au nom du rôle (présumé valide) dont les privilèges et propriétés doivent être transférées ;[optionnel]
n_role_cible
est une chaîne de caractères correspondant au nom du rôle cible pour le transfert (présumé valide). SiNULL
,g_admin
reçoit la propriété éventuelle des objets et les privilèges sont révoqués sans transfert ;[optionnel]
b_hors_asgard
est un booléen, valeur par défautFalse
. Si ce paramètre vautTrue
, la propriété et les privilèges sur les objets des schémas non gérés par ASGARD ou hors schémas sont pris en compte ;[optionnel]
b_privileges
est un booléen, valeur par défautTrue
. Indique si, dans l’hypothèse où le rôle cible est spécifié, celui-ci doit recevoir les privilèges et propriétés du rôle (True
) ou seulement ses propriétés (False
) ;[optionnel]
b_default_acl
est un booléen, valeur par défautFalse
. Indique si les privilèges par défaut doivent être pris en compte (True
) ou non (False
) en plus du reste. Si le paramètreb_hors_asgard
vautFalse
, seuls les privilèges par défaut définis sur les schémas d’ASGARD seront considérés.
Les valeurs de n_role
et n_role_cible
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 'g_Rôle' et non '"g_Rôle"'.
Résultat⚓
Liste des bases du serveur sur lesquelles le rôle n_role
a encore des droits à l’issue de l’exécution de la fonction. À noter que la base courante peut faire partie de cette liste si la fonction n’a pas été exécutée avec le paramètre b_hors_asgard
valant True
.
Des messages rendent compte des commandes effectivement lancées.
On notera que, pour modifier les propriétaires des objets hors schémas référencés par ASGARD, la fonction utilise la commande REASSIGN OWNED
de PostgreSQL. Celle-ci apparaît dans les messages, mais le détail des propriétés effectivement réaffectées n’est pas fourni. Il peut d’ailleurs n’y en avoir aucune si le rôle n’était propriétaire d’aucun objet de ce type.
Exemple :
On veut supprimer le rôle g_admin_delegue
, qui était éditeur de z_asgard
et disposait du privilège CREATE
sur la base, qui lui permettait de créer des schémas. Ce rôle était en outre producteur d’un schéma z_admin_delegue
, qui pour l’heure est vide.
Si on lance la fonction dans sa forme la plus simple, avec un seul argument :
SELECT z_asgard_admin.asgard_reaffecte_role('g_admin_delegue') ;
NOTICE: attribution de la propriété du schéma et des objets au rôle producteur du schéma z_admin_delegue :
NOTICE: > ALTER SCHEMA z_admin_delegue OWNER TO g_admin
NOTICE: ... Le producteur du schéma z_admin_delegue a été redéfini.
NOTICE: suppression des privilèges de l'ancien éditeur du schéma z_asgard :
NOTICE: > REVOKE USAGE ON SCHEMA z_asgard FROM g_admin_delegue
NOTICE: > REVOKE SELECT ON TABLE z_asgard.qgis_menubuilder_metadata FROM g_admin_delegue
NOTICE: > REVOKE INSERT ON TABLE z_asgard.qgis_menubuilder_metadata FROM g_admin_delegue
NOTICE: > REVOKE UPDATE ON TABLE z_asgard.qgis_menubuilder_metadata FROM g_admin_delegue
NOTICE: > REVOKE DELETE ON TABLE z_asgard.qgis_menubuilder_metadata FROM g_admin_delegue
NOTICE: > REVOKE SELECT ON TABLE z_asgard.gestion_schema_etr FROM g_admin_delegue
NOTICE: > REVOKE INSERT ON TABLE z_asgard.gestion_schema_etr FROM g_admin_delegue
NOTICE: > REVOKE UPDATE ON TABLE z_asgard.gestion_schema_etr FROM g_admin_delegue
NOTICE: > REVOKE DELETE ON TABLE z_asgard.gestion_schema_etr FROM g_admin_delegue
NOTICE: > REVOKE SELECT ON TABLE z_asgard.gestion_schema_usr FROM g_admin_delegue
NOTICE: > REVOKE INSERT ON TABLE z_asgard.gestion_schema_usr FROM g_admin_delegue
NOTICE: > REVOKE UPDATE ON TABLE z_asgard.gestion_schema_usr FROM g_admin_delegue
NOTICE: > REVOKE DELETE ON TABLE z_asgard.gestion_schema_usr FROM g_admin_delegue
NOTICE: ... L'éditeur du schéma z_asgard a été redéfini.
La propriété du schéma z_admin_delegue
est conférée à g_admin
, l’éditeur du schéma z_asgard
est supprimé. Le paramétrage choisi a limité le champ d’action de la fonction aux seuls schémas référencés, ainsi le privilège CREATE
sur la base est toujours présent, ce qui empêche la suppression du rôle. La fonction en rend compte en retournant le nom de la base, icigeobase_asgard
.
On aurait pu prendre en considération la totalité des objets de la base (et les objets partagés entre bases) avec la forme suivante :
SELECT z_asgard_admin.asgard_reaffecte_role('g_admin_delegue', b_hors_asgard := True) ;
En plus des messages déjà précédemment renvoyés, on aurait alors :
NOTICE: > REASSIGN OWNED BY g_admin_delegue TO g_admin
NOTICE: ... Le cas échéant, la propriété des objets hors schémas référencés par ASGARD a été réaffectée. NOTICE: > REVOKE CREATE ON DATABASE geobase_snum FROM g_admin_delegue
NOTICE: ... Les privilèges résiduels du rôle g_admin_delegue sur les objets hors schémas ont été révoqués.
Cette fois, le privilège CREATE
sur la base est bien révoqué. Le rôle n’a plus aucun droit sur les objets, comme le confirme la fonction en ne renvoyant rien. Il peut donc être supprimé.
S’il était possible que des privilèges par défaut aient été définis pour g_admin_delegue
, alors la forme suivante aurait permis de les nettoyer également :
SELECT z_asgard_admin.asgard_reaffecte_role('g_admin_delegue', b_hors_asgard := True, b_default_acl := True) ;
[idem]
NOTICE: > ALTER DEFAULT PRIVILEGES FOR ROLE g_admin IN SCHEMA z_admin REVOKE SELECT ON TABLES FROM g_admin_delegue
NOTICE: ... Les privilèges par défaut du rôle g_admin_delegue ont été supprimés.
Exemple :
Il était également possible de transférer les droits de g_admin_delegue
à un autre rôle plutôt que de les supprimer. Dans cet exemple, ce rôle cible est g_snum
et on choisit de transférer également les privilèges sur les objets non gérés par ASGARD.
SELECT z_asgard_admin.asgard_reaffecte_role('g_admin_delegue', 'g_snum', b_hors_asgard := True) ;
NOTICE: attribution de la propriété du schéma et des objets au rôle producteur du schéma z_admin_delegue :
NOTICE: > ALTER SCHEMA z_admin_delegue OWNER TO g_snum
NOTICE: ... Le producteur du schéma z_admin_delegue a été redéfini.
NOTICE: suppression et transfert vers le nouvel éditeur des privilèges de l'ancien éditeur du schéma z_asgard :
NOTICE: > GRANT USAGE ON SCHEMA z_asgard TO g_snum
NOTICE: > REVOKE USAGE ON SCHEMA z_asgard FROM g_admin_delegue
NOTICE: > GRANT SELECT ON TABLE z_asgard.qgis_menubuilder_metadata TO g_snum
NOTICE: > REVOKE SELECT ON TABLE z_asgard.qgis_menubuilder_metadata FROM g_admin_delegue
NOTICE: > GRANT INSERT ON TABLE z_asgard.qgis_menubuilder_metadata TO g_snum
NOTICE: > REVOKE INSERT ON TABLE z_asgard.qgis_menubuilder_metadata FROM g_admin_delegue NOTICE: > GRANT UPDATE ON TABLE z_asgard.qgis_menubuilder_metadata TO g_snum
NOTICE: > REVOKE UPDATE ON TABLE z_asgard.qgis_menubuilder_metadata FROM g_admin_delegue
NOTICE: > GRANT DELETE ON TABLE z_asgard.qgis_menubuilder_metadata TO g_snum
NOTICE: > REVOKE DELETE ON TABLE z_asgard.qgis_menubuilder_metadata FROM g_admin_delegue
[… idem pour les vues gestion_schema_etr et gestion_schema_use]
NOTICE: ... L'éditeur du schéma z_asgard a été redéfini.
NOTICE: > REASSIGN OWNED BY g_admin_delegue TO g_snum
NOTICE: ... Le cas échéant, la propriété des objets hors schémas référencés par ASGARD a été réaffectée. NOTICE: > REVOKE CREATE ON DATABASE geobase_dev FROM g_admin_delegue
NOTICE: > GRANT CREATE ON DATABASE geobase_dev TO g_snum
NOTICE: ... Les privilèges résiduels du rôle g_admin_delegue sur les objets hors schémas ont été réaffectés.