使用psql列出数据库特权


141

我正处于数据库服务器迁移的中间,无法确定(在此处进行搜索和搜索之后)如何使用psql命令行工具在PostgreSQL上列出数据库特权(或整个服务器上的所有特权)?

我在Ubuntu 11.04上,我的PostgreSQL版本是8.2.x。

Answers:


115
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

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


5
\z myTable是完美的确保你已经成功地获准进入的人,避免看起来像一个白痴当你说“还好它现在的工作吗?不???
ijoseph

107

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

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 2011年

79

您可以执行以下操作:

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

这将为您提供这种输出:

mail=# select grantee, privilege_type from information_schema.role_table_grants where table_name='aliases';
   grantee    |  privilege_type
--------------+-----------------
 mailreader   |  INSERT
 mailreader   |  SELECT
 mailreader   |  UPDATE
 mailreader   |  DELETE
 mailreader   |  TRUNCATE
 mailreader   |  REFERENCES
 mailreader   |  TRIGGER
(7 rows)

mail=#

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


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

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

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

15

使用psql元命令:

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

使用Ctrl + F翻页显示:

\ddp [ pattern ] 列出默认的访问权限设置。

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

\l[+] [ pattern ] 列出服务器中的数据库,并显示....访问权限。

上面也提到过,但在手册页上找不到单词“ privileges”:

\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中)时,带有特权列表的警告被折叠,但是您仍然可以在日志中找到它的完整信息...


12

当您发出\du命令时,Undercovers 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

`“错误:r.rolbypassrls列不存在\ n \ n第9列,r.rolbypassrls \ n \ n ^ \ n”,`很遗憾,它无法正常工作
ribamar

10

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

sudo su - postgres
psql -l

要么

psql
postgres=> \l

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

-1
-- file: src/sql/pgsql/list-table-priviledges.sql
-- usage:
-- alias psql="PGPASSWORD=${postgres_db_useradmin_pw:-} psql -v -q -t -X -w -U ${postgres_db_useradmin:-}"
-- psql -d dev_qto < src/sql/pgsql/list-table-priviledges.sql | less
SELECT grantee, table_name , privilege_type
FROM information_schema.role_table_grants
WHERE 1=1
AND grantee = 'usrqtoapp'
AND table_name='readme_doc'
;

-- purpose:
-- list the priveledges per user or for user in a database
-- eof file: src/sql/pgsql/list-table-priviledges.sql

输出

usrqtoapp | readme_doc | INSERT
usrqtoapp | readme_doc | SELECT
usrqtoapp | readme_doc | UPDATE
usrqtoapp | readme_doc | DELETE
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.