如何检查所有postgres数据库中存在的用户列表

Rah*_*hul 5 postgresql users

我有大约 50 个 postgres 数据库。我需要用他们各自的数据库名称检查所有用户。我知道\du给出了所有用户喜欢的列表,

                                    List of roles
            Role name             |            Attributes             |      Member of
----------------------------------+-----------------------------------+----------------------
foo                             Superuser                              {}
..
..
Run Code Online (Sandbox Code Playgroud)

它不显示数据库名称。我可以手动登录到每个数据库并运行\du以查看该数据库中存在的用户列表,但这会花费很多时间。那么是否有单行命令或简单的解决方法可以显示用户列表及其各自的数据库名称?

a_h*_*ame 8

用户对于 Postgres 实例(又名“集群”)是全局的。所以没有“他们各自的数据库名称”这样的东西。\du无论您连接到哪个数据库,都将始终向您显示相同的用户列表。


如果您想获取允许用户连接的数据库列表,您可以使用以下查询来实现:

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
Run Code Online (Sandbox Code Playgroud)

要“绕过”该查询并列出允许连接到每个数据库的用户,您可以使用以下命令:

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;
Run Code Online (Sandbox Code Playgroud)