\l 中何时列出权限,何时不列出?

Cro*_*han 12 postgresql permissions psql

\l 什么时候列出访问权限,什么时候不列出?\l 列出的访问权限可以在授予和撤销后更改:

$ createuser -EP my_readonly
$ psql development
development=# \l
                                           List of databases
            Name             |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------------------------+----------+----------+-------------+-------------+-----------------------
 development                 | vagrant  | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | 
...
development=# grant usage on schema public to my_readonly;
development=# grant connect on database development to my_readonly;
development=# \l
                                             List of databases
            Name             |  Owner   | Encoding |   Collate   |    Ctype    |     Access privileges      
-----------------------------+----------+----------+-------------+-------------+----------------------------
 development                 | vagrant  | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | =Tc/vagrant               +
                             |          |          |             |             | vagrant=CTc/vagrant       +
                             |          |          |             |             | my_readonly=c/vagrant
...
development=# revoke connect on database development from my_readonly;
REVOKE
development=# revoke usage on schema public from my_readonly;
REVOKE
development=# \l
                                           List of databases
            Name             |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------------------------+----------+----------+-------------+-------------+-----------------------
 development                 | vagrant  | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | =Tc/vagrant          +
                             |          |          |             |             | vagrant=CTc/vagrant
Run Code Online (Sandbox Code Playgroud)

这是为什么?什么状态变了?我相信 my_readonly 用户的连接能力在整个 psql 会话中没有改变(因为我猜测 PUBLIC 角色具有连接权限),但显然有些变化:那是什么?

附带问题:我如何明确询问 postgres PUBLIC 实际上是否确实具有连接权限(它们可能已被撤销 - 请参阅为什么新用户可以从任何表中选择?)?

Kas*_*dry 5

psql 中的反斜杠命令是查询或查看系统目录的查询的快捷方式。该\l命令查看 中的信息pg_catalog.pg_database,特别是以下查询:

SELECT d.datname as "Name",
   pg_catalog.pg_get_userbyid(d.datdba) as "Owner",
   pg_catalog.pg_encoding_to_char(d.encoding) as "Encoding",
   d.datcollate as "Collate",
   d.datctype as "Ctype",
   pg_catalog.array_to_string(d.datacl, E'\n') AS "Access privileges"
FROM pg_catalog.pg_database d
ORDER BY 1;
Run Code Online (Sandbox Code Playgroud)

您可以psql通过-E在命令行上调用它时将标志传递给它来显示它用于反斜杠命令的内容。

如果数据库或其他对象的权限是 PostgreSQL 创建它们时使用的默认值,则该*acl列将为NULL. 如果您更改默认值,则 ACL 列将填充与您运行的GRANT和/或REVOKE语句相关的信息。

您可以通过专门查看权限/ ACL的两种\z\dp

如果您在此处进一步阅读:

http://www.postgresql.org/docs/9.4/static/sql-grant.html

如果向下滚动(或搜索单词psql),您可以查看显示如何解释您\l在 ACL 列中或在 ACL 列中看到的 ACL 的表格。

例如:

=Tc/vagrant

意味着 PUBLIC(包含所有角色的隐式角色)具有创建临时表T和 connect 的权限c,因为 ACL 行=xxxxx表示应用于 PUBLIC 的权限,同时rolname=xxxx适用于该特定角色。

Dalibo 的这个演讲也应该有助于进一步澄清这一点:在 PostgreSQL 中管理权限

希望有帮助。=)