我正处于数据库服务器迁移的中间,无法确定(在此处搜索和搜索之后)如何使用psql命令行工具在PostgreSQL上列出数据库特权(或整个服务器上的所有特权)? br />
我在Ubuntu 11.04上,我的PostgreSQL版本是8.2.x。

#1 楼

postgres=> \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres


关于“特权”的文档对如何解释输出进行了解释。要获得当前数据库表的特定特权,请使用\z myTable

评论


\ z myTable非常适合确保您已成功授予访问权限,并且在您说“现在可以正常工作吗?它不起作用吗?”时避免看起来像个白痴。

– ijoseph
18年7月17日在17:50



#2 楼

也许您的意思是列出数据库的用户及其特权-从这个问题我无法完全看出:

postgres=> \du
                             List of roles
    Role name    |  Attributes  |                    Member of
-----------------+--------------+------------------------------------------------
 dba             | Create role  | {util_user,helpdesk_user,helpdesk_admin}
 helpdesk_admin  | Cannot login | {helpdesk_user}
 helpdesk_user   | Cannot login | {helpdesk_reader}
 jack            |              | {helpdesk_admin}
 postgres        | Superuser    | {}
                 : Create role
                 : Create DB


评论


不,我想要一种列出特定数据库特权的方法,但是我已经弄清楚了。数据库所有者始终拥有所有特权,对吗?然后,我们可以在数据库上向其他用户/组添加更多特权。这些用\ l命令列出。但是还是非常感谢。

–pedrosanta
11年8月18日在16:20



#3 楼

您可以执行以下操作:

SELECT grantee, privilege_type 
FROM information_schema.role_table_grants 
WHERE table_name='mytable'


这将为您提供这种输出:

评论


欢迎光临本站!一个小问题:为什么将输出插入为屏幕截图?请尽可能多地使用普通文字。

– dezso
16-10-18在7:20

meta.stackoverflow.com/questions/285551/…

– a_horse_with_no_name
16-10-18在8:10

有没有一种方法可以查看序列许可?这仅提供表格信息

–好奇
16 Dec 1'在12:50



请注意(至少在Postgres 9.4中),以上不适用于实例化视图。

–很少需要“莫妮卡在哪里”
17年4月14日在23:24

@HimanshuChauhan如果我使用角色“邮件阅读器”添加新角色“ new_role”,则information_schema.role_table_grants是否也会列出new_role?

– Anand
17年6月8日在20:57

#4 楼

使用psql元命令:

https://www.postgresql.org/docs/current/static/app-psql.html

使用Ctrl +浏览页面F提供:


\ddp [ pattern ]
\dp [ pattern ]列出具有
相关访问权限的表,视图和序列。 。

\l[+] [ pattern ]列出服务器中的数据库并显示....
访问权限。手册页上的“特权”:

\du+用于登录的角色,\dg+用于未登录的角色-将提交"Member of",您可以在其中找到授予角色的角色。

请在psql手册中以几乎没有被操纵的方式跳过此处的功能和语言特权(并且,如果您确实使用了这些特权,则不会在此处寻求建议)。与用户定义的类型,域等相同-在meta命令后使用“ +”将向您显示特权(如果适用)。


检查特权的一种极端方法是删除交易中的用户,例如:

s=# begin; drop user x;
BEGIN
Time: 0.124 ms
ERROR:  role "x" cannot be dropped because some objects depend on it
DETAIL:  privileges for type "SO dT"
privileges for sequence so
privileges for schema bin
privileges for table xx
privileges for table "csTest"
privileges for table tmp_x
privileges for table s1
privileges for table test
Time: 0.211 ms
s=# rollback;
ROLLBACK
Time: 0.150 ms


当列表长于N(至少在9.3中)时,带有特权列表的警告被折叠,但是您仍然可以在日志中找到完整的文件...

#5 楼

发出\du命令时,卧底psql使用波纹管查询。

SELECT r.rolname, r.rolsuper, r.rolinherit,
  r.rolcreaterole, r.rolcreatedb, r.rolcanlogin,
  r.rolconnlimit, r.rolvaliduntil,
  ARRAY(SELECT b.rolname
        FROM pg_catalog.pg_auth_members m
        JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid)
        WHERE m.member = r.oid) as memberof
, r.rolreplication
, r.rolbypassrls
FROM pg_catalog.pg_roles r
WHERE r.rolname !~ '^pg_'
ORDER BY 1;


评论


这是sql标准吗?

–ribamar
18/12/31在15:08

`“错误:r.rolbypassrls列不存在\ n \ n第9行:r.rolbypassrls \ n \ n ^ \ n”,不幸的是,它不起作用

–ribamar
18/12/31在15:16

#6 楼

一个(可能很明显)的额外步骤是成为postgres用户,否则您可能会遇到有关不存在的角色的错误。



sudo su - postgres
psql -l


评论


Meta:添加我的原因是,这个问题在google查询“ postgres列表角色”中得到了很高的评价,在我发现自己想要的东西之前,我花了一些时间在排名低得多的结果中,所以我纪念了这些额外的信息。

–亚当·肖克(Adam Shostack)
15年12月18日在19:04

#7 楼

这样可以列出角色的所有特权(授予):

#8 楼

您可以输入以下内容:
SELECT * FROM pg_roles;

,您会得到
rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolconnlimit | rolpassword | rolvaliduntil | rolbypassrls | rolconfig | oid

也许在这里您会认为角色太多,这次您可以使用WHERE选择您想看到什么角色
SELECT * FROM pg_roles WHERE rolname='your role name';

实际上,您也可以只输入
\du

,您将看到创建的所有角色而不是默认角色

评论


这与先前发布的现有答案有何不同?

–必须
6月21日14:56

我认为,在此作为以前的补充,以前的答案缺少本部分或不够简洁。

–徐ick
6月21日15:09

#9 楼

这是我的查询,包含关于此问题的多个答案:

 SELECT grantee AS user, CONCAT(table_schema, '.', table_name) AS table, 
    CASE 
        WHEN COUNT(privilege_type) = 7 THEN 'ALL'
        ELSE ARRAY_TO_STRING(ARRAY_AGG(privilege_type), ', ')
    END AS grants
FROM information_schema.role_table_grants
GROUP BY table_name, table_schema, grantee;
 


这会导致某些问题像这样:

+------+--------------+----------------+
| user |    table     |     grants     |
+------+--------------+----------------+
| foo  | schema.table | ALL            |
| bar  | schema.table | SELECT, INSERT |
+------+--------------+----------------+


评论


在pg 9.4中遇到此错误-错误:找不到数据类型为information_schema.character_data的数组类型

–亚当·穆拉(Adam Mulla)
11月4日7:40