请解释 PostgreSQL 中
\z
命令的输出。我理解许可,我阅读了文档,但不知何故我错过了 \z
输出的解释。
datastore_default=> \z
Access privileges
Schema | Name | Type | Access privileges | Column access privileges
--------+-----------------+-------+-----------------------------------+--------------------------
public | _table_metadata | view | ckan_default=arwdDxt/ckan_default+|
| | | datastore_default=r/ckan_default +|
| | | readonlyuser=r/ckan_default +|
public | foo | table | ckan_default=arwdDxt/ckan_default+|
| | | datastore_default=r/ckan_default +|
| | | readonlyuser=r/ckan_default +|
不知怎的,
readonlyuser
似乎能够读取表foo
和_foo,但实际上却不能。两个命令都会返回错误:
sudo -u postgres psql -d datastore_default -U readonlyuser -c 'SELECT * FROM foo'
sudo -u postgres psql -d datastore_default -U readonlyuser -c 'SELECT * FROM public.foo'
ERROR: permission denied for schema public
LINE 1: SELECT * FROM public.foo
编辑:显然我对数据库和模式权限的工作方式了解甚少。首先,只有数据库管理员(用户 postgres)或数据库所有者(在我的例子中为用户 ckan_default)可以授予其他用户对特定数据库的权限。该模式仅在数据库级别,所以我添加
readonlyuser
查看公共模式的权限是可以的,无论如何它都无法从其他数据库中进行选择。
错误表示 schema public 的权限被拒绝(强调我的)
您需要授予公共架构的只读用户权限:
GRANT USAGE ON SCHEMA public TO readonlyuser;
ACL 的内容在本页有解释。这里引用了最相关的部分:
rolename=xxxx -- privileges granted to a role =xxxx -- privileges granted to PUBLIC r -- SELECT ("read") w -- UPDATE ("write") a -- INSERT ("append") d -- DELETE D -- TRUNCATE x -- REFERENCES t -- TRIGGER X -- EXECUTE U -- USAGE C -- CREATE c -- CONNECT T -- TEMPORARY arwdDxt -- ALL PRIVILEGES (for tables, varies for other objects) * -- grant option for preceding privilege /yyyy -- role that granted this privilege
+ 是 psql 格式化结果的方式的一部分,它们不是值的一部分。
PostgreSQL 有 3 层对象(数据库、模式、对象,例如表),并且还向数据库对象所有者隐式授予
这意味着我们需要
要查看这些权限:
\l+
查看数据库的权限\dn+
查看架构的权限\dp+
查看表的权限特权在这里看到
我们还需要了解以下格式的acl条目:
grantee=privilege-abbreviation[*]/grantor
例如在以下
\dp+
acl 示例中,user
已被 postgres
角色 授予所有权限
user=arwdDxt/postgres
如果acl条目为空,则表示该对象具有默认所有者权限(所有权限)
如果给定对象的“被授予者”列为空,则意味着权限被授予
PUBLIC
角色(存在的每个角色)
=UC/postgres
使用公共模式时也很混乱。您对架构拥有 CREATE 权限,因此当使用同一用户创建表时,您可以选择数据,并且您拥有开箱即用的所有者权限。
此外。在执行上述任何操作之前,您必须连接到集群。这意味着使用具有
LOGIN
权限的角色并使用有效密码和 SSL 进行连接。