web-dev-qa-db-fra.com

comment vérifier la liste des utilisateurs présents dans toutes les bases de données postgres

J'ai environ 50 bases de données postgres. Je dois vérifier tous les utilisateurs avec leur nom de base de données respectif. Je connais \du donne la liste de tous les utilisateurs comme,

                                    List of roles
            Role name             |            Attributes             |      Member of
----------------------------------+-----------------------------------+----------------------
foo                             Superuser                              {}
..
..

qui n'affiche pas le nom de la base de données. Je peux me connecter manuellement à chaque base de données et exécuter \du pour voir la liste des utilisateurs présents dans cette base de données, mais cela prendrait beaucoup de temps. Existe-t-il donc une commande à ligne unique ou une solution de contournement simple qui peut afficher la liste des utilisateurs avec leur nom de base de données respectif?

5
Rahul

Les utilisateurs sont globaux à l'instance Postgres (alias "cluster"). Il n'y a donc rien de tel que "leur nom de base de données respectif". \du affichera toujours la même liste d'utilisateurs, quelle que soit la base de données à laquelle vous êtes connecté.


Si vous souhaitez obtenir une liste des bases de données auxquelles un utilisateur est autorisé à se connecter, vous pouvez le faire avec cette requête:

select u.usename,
       (select string_agg(d.datname, ',' order by d.datname) 
        from pg_database d 
        where has_database_privilege(u.usename, d.datname, 'CONNECT')) as allowed_databases
from pg_user u
order by u.usename

Pour inverser cette requête et répertorier les utilisateurs autorisés à se connecter à chaque base de données, vous pouvez utiliser ceci:

select d.datname,
       (select string_agg(u.usename, ',' order by u.usename) 
        from pg_user u 
        where has_database_privilege(u.usename, d.datname, 'CONNECT')) as allowed_users
from pg_database d
order by d.datname;
8