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.

Schéma

z_asgard_admin

Seuls g_admin[6] et ses membres sont habilités à utiliser cette fonction.

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

  1. 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 ;

  2. [optionnel] n_role_cible est une chaîne de caractères correspondant au nom du rôle cible pour le transfert (présumé valide). Si NULL, g_admin reçoit la propriété éventuelle des objets et les privilèges sont révoqués sans transfert ;

  3. [optionnel] b_hors_asgard est un booléen, valeur par défaut False. Si ce paramètre vaut True, 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 ;

  4. [optionnel] b_privileges est un booléen, valeur par défaut True. 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) ;

  5. [optionnel] b_default_acl est un booléen, valeur par défaut False. Indique si les privilèges par défaut doivent être pris en compte (True) ou non (False) en plus du reste. Si le paramètre b_hors_asgard vaut False, 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 :

1
2
SELECT z_asgard_admin.asgard_reaffecte_role('g_admin_delegue') ;
1
2
NOTICE: attribution de la propriété du schéma et des objets au rôle producteur du schéma z_admin_delegue :
3
NOTICE: > ALTER SCHEMA z_admin_delegue OWNER TO g_admin
4
NOTICE: ... Le producteur du schéma z_admin_delegue a été redéfini.
5
NOTICE: suppression des privilèges de l'ancien éditeur du schéma z_asgard :
6
NOTICE: > REVOKE USAGE ON SCHEMA z_asgard FROM g_admin_delegue
7
NOTICE: > REVOKE SELECT ON TABLE z_asgard.qgis_menubuilder_metadata FROM g_admin_delegue
8
NOTICE: > REVOKE INSERT ON TABLE z_asgard.qgis_menubuilder_metadata FROM g_admin_delegue
9
NOTICE: > REVOKE UPDATE ON TABLE z_asgard.qgis_menubuilder_metadata FROM g_admin_delegue
10
NOTICE: > REVOKE DELETE ON TABLE z_asgard.qgis_menubuilder_metadata FROM g_admin_delegue
11
NOTICE: > REVOKE SELECT ON TABLE z_asgard.gestion_schema_etr FROM g_admin_delegue
12
NOTICE: > REVOKE INSERT ON TABLE z_asgard.gestion_schema_etr FROM g_admin_delegue
13
NOTICE: > REVOKE UPDATE ON TABLE z_asgard.gestion_schema_etr FROM g_admin_delegue
14
NOTICE: > REVOKE DELETE ON TABLE z_asgard.gestion_schema_etr FROM g_admin_delegue
15
NOTICE: > REVOKE SELECT ON TABLE z_asgard.gestion_schema_usr FROM g_admin_delegue
16
NOTICE: > REVOKE INSERT ON TABLE z_asgard.gestion_schema_usr FROM g_admin_delegue
17
NOTICE: > REVOKE UPDATE ON TABLE z_asgard.gestion_schema_usr FROM g_admin_delegue
18
NOTICE: > REVOKE DELETE ON TABLE z_asgard.gestion_schema_usr FROM g_admin_delegue
19
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 :

1
2
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 :

1
2
NOTICE: > REASSIGN OWNED BY g_admin_delegue TO g_admin
3
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
4
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 :

1
2
SELECT z_asgard_admin.asgard_reaffecte_role('g_admin_delegue', b_hors_asgard := True, b_default_acl := True) ;
1
2
[idem]
3
NOTICE: > ALTER DEFAULT PRIVILEGES FOR ROLE g_admin IN SCHEMA z_admin REVOKE SELECT ON TABLES FROM g_admin_delegue
4
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.

1
2
SELECT z_asgard_admin.asgard_reaffecte_role('g_admin_delegue', 'g_snum', b_hors_asgard := True) ;
1
2
NOTICE: attribution de la propriété du schéma et des objets au rôle producteur du schéma z_admin_delegue :
3
NOTICE: > ALTER SCHEMA z_admin_delegue OWNER TO g_snum
4
NOTICE: ... Le producteur du schéma z_admin_delegue a été redéfini.
5
NOTICE: suppression et transfert vers le nouvel éditeur des privilèges de l'ancien éditeur du schéma z_asgard :
6
NOTICE: > GRANT USAGE ON SCHEMA z_asgard TO g_snum
7
NOTICE: > REVOKE USAGE ON SCHEMA z_asgard FROM g_admin_delegue
8
NOTICE: > GRANT SELECT ON TABLE z_asgard.qgis_menubuilder_metadata TO g_snum
9
NOTICE: > REVOKE SELECT ON TABLE z_asgard.qgis_menubuilder_metadata FROM g_admin_delegue
10
NOTICE: > GRANT INSERT ON TABLE z_asgard.qgis_menubuilder_metadata TO g_snum
11
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
12
NOTICE: > REVOKE UPDATE ON TABLE z_asgard.qgis_menubuilder_metadata FROM g_admin_delegue
13
NOTICE: > GRANT DELETE ON TABLE z_asgard.qgis_menubuilder_metadata TO g_snum
14
NOTICE: > REVOKE DELETE ON TABLE z_asgard.qgis_menubuilder_metadata FROM g_admin_delegue
15
[… idem pour les vues gestion_schema_etr et gestion_schema_use]
16
NOTICE: ... L'éditeur du schéma z_asgard a été redéfini.
17
NOTICE: > REASSIGN OWNED BY g_admin_delegue TO g_snum
18
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
19
NOTICE: > GRANT CREATE ON DATABASE geobase_dev TO g_snum
20
NOTICE: ... Les privilèges résiduels du rôle g_admin_delegue sur les objets hors schémas ont été réaffectés.