Disons que j'ai deux groupes de base de données Postgresql, "auteurs" et "éditeurs", et deux utilisateurs, "maxwell" et "ernest".
create role authors;
create role editors;
create user maxwell;
create user ernest;
grant authors to editors; --editors can do what authors can do
grant editors to maxwell; --maxwell is an editor
grant authors to ernest; --ernest is an author
Je voudrais écrire une fonction performante qui retourne une liste des rôles (de préférence leur oid) auxquels maxwell appartient, quelque chose comme ceci:
create or replace function get_all_roles() returns oid[] ...
Il devrait retourner les oids pour maxwell, les auteurs et les éditeurs (mais pas ernest).
Mais je ne sais pas comment le faire en cas d'héritage.
la source
pg_has_role()
est probablement un peu plus rapide que ma requête récursive, même si cela n'a guère d'importance. Une dernière chose cependant: il renvoie tous les rôles pour les super-utilisateurs, ce qui peut ou non être un effet secondaire bienvenu. C'est là que le résultat diffère de ma requête.Il s'agit d'une version simplifiée de la réponse de Craig Ringer qu'un non-superutilisateur peut utiliser directement:
pg_roles
est essentiellement une vue surpg_authid
accessible au public, car elle ne révèle pas les mots de passe, contrairement àpg_authid
. La baseoid
est même exportée dans la vue. Lorsque vous n'avez pas besoin de mots de passe, il est inutile de créer la fonction dédiée appartenant au superutilisateur.la source
Voici mon point de vue à ce sujet. Cela fonctionne pour un utilisateur spécifique ou tous les utilisateurs.
la source
Je crois que ça le fera
Si vous préférez obtenir les noms de rôle, remplacez le premier
oid
parrolname
.la source
si vous souhaitez connaître tous les rôles de votre rôle actuellement actif:
la source