列出 PostgreSQL 上的数据库 CONNECT 权限

Myl*_*les 2 postgresql permissions

如何查看用户的 CONNECT 等数据库级别权限?

我已经找到了两种方法,但都不是完美的:

使用功能has_database_privilege()

这可行,但我必须为每个用户一一手动运行它:

SELECT has_database_privilege('david', 'postgres', 'connect');
Run Code Online (Sandbox Code Playgroud)

这似乎返回了不完整的结果。它NULL首先返回,但david其他用户仍然可以连接到postgres数据库。仅当我在该数据库上运行任何GRANT命令(当然还有REVOKE)之后,该表才会填充一些结果:{=Tc/postgres,postgres=CTc/postgres}。所以我想我每次使用这种方法之前都必须GRANT这样做?REVOKE

SELECT datname as "Relation", 
       datacl as "Permissions" 
FROM pg_database 
WHERE datname = 'postgres';
Run Code Online (Sandbox Code Playgroud)

在 Ubuntu 上使用 PostgreSQL 10.9

小智 5

您可以将该函数用作检索所有用户的选择的一部分:

SELECT rolname, has_database_privilege(rolname, 'postgres', 'connect')
from pg_roles
where rolcanlogin;
Run Code Online (Sandbox Code Playgroud)

您可以扩展它,为每个数据库中的每个用户显示此信息:

select db.datname, r.rolname, has_database_privilege(r.rolname, db.datname, 'connect')
from pg_roles r
  cross join pg_database db
where r.rolcanlogin
  and db.datallowconn
order by db.datname, r.rolname;
Run Code Online (Sandbox Code Playgroud)