如何检查所有角色/用户/组角色在 postgres 数据库中有什么权限?

Jay*_*esh 2 postgresql amazon-rds psql

我有 postgres 数据库。我想要分配给他们访问权限的用户列表。

我试图查找查询并查看 psql 命令行帮助。(\nu 和所有) 但我没有找到任何有用的信息。

有没有人知道可以帮助我。

谢谢。

小智 10

很少有像 \du 和 \l 这样的基本命令可以提供一般信息。

要获取详细信息,您可以使用以下功能。

CREATE OR REPLACE FUNCTION database_privs(text) RETURNS table(username text,dbname name,privileges  text[])
AS
$$
SELECT $1, datname, array(select privs from unnest(ARRAY[
( CASE WHEN has_database_privilege($1,c.oid,'CONNECT') THEN 'CONNECT' ELSE NULL END),
(CASE WHEN has_database_privilege($1,c.oid,'CREATE') THEN 'CREATE' ELSE NULL END),
(CASE WHEN has_database_privilege($1,c.oid,'TEMPORARY') THEN 'TEMPORARY' ELSE NULL END),
(CASE WHEN has_database_privilege($1,c.oid,'TEMP') THEN 'CONNECT' ELSE NULL END)])foo(privs) WHERE privs IS NOT NULL) FROM pg_database c WHERE 
has_database_privilege($1,c.oid,'CONNECT,CREATE,TEMPORARY,TEMP') AND datname not in ('template0');
$$ language sql;
Run Code Online (Sandbox Code Playgroud)

然后通过提供从 \du 获得的用户名/角色来调用相同的函数

postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of 
-----------+------------------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 test      |                                                            | {}
 test2     |                                                            | {}
 test3     |                                                            | {}

postgres=# select * from database_privs('test');
 username |  dbname   |         privileges          
----------+-----------+-----------------------------
 test     | postgres  | {CONNECT,TEMPORARY,CONNECT}
 test     | template1 | {CONNECT}
 test     | test      | {CONNECT,TEMPORARY,CONNECT}
(3 rows)
Run Code Online (Sandbox Code Playgroud)


小智 8

这里作为对前文的补充。

要检查用户的权限,请执行以下操作:

SELECT * FROM pg_user;
Run Code Online (Sandbox Code Playgroud)

以同样的方式,检查角色:

SELECT * FROM pg_roles;
Run Code Online (Sandbox Code Playgroud)