web-dev-qa-db-ja.com

すべてのpostgresデータベースに存在するユーザーのリストを確認する方法

約50のpostgresデータベースがあります。すべてのユーザーをそれぞれのデータベース名で確認する必要があります。知っている \duは、すべてのユーザーのリストを提供します。

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

データベース名は表示されません。各データベースに手動でログインして\duそのデータベースに存在するユーザーのリストを表示するには、時間がかかります。それで、それぞれのデータベース名でユーザーリストを表示できる単一行コマンドまたは簡単な回避策はありますか?

5
Rahul

ユーザーはPostgresインスタンス(別名「クラスター」)に対してグローバルです。したがって、「それぞれのデータベース名」などはありません。 \duは、接続しているデータベースに関係なく、常に同じユーザーリストを表示します。


ユーザーがconnectに許可されているデータベースのリストを取得するには、次のクエリを使用します。

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

そのクエリを「回避」し、各データベースへの接続を許可されているユーザーをリストするには、次のように使用できます。

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;