PostgreSQL 权限解释
Posted
技术标签:
【中文标题】PostgreSQL 权限解释【英文标题】:PostgreSQL permissions explained 【发布时间】:2014-10-30 17:04:57 【问题描述】:请解释 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
查看公共架构的权限是可以的,无论如何它无法从其他数据库中选择。
【问题讨论】:
我在我的答案中添加了一些关于阅读 ACL 的详细信息。 【参考方案1】:错误表明 schema public 的权限被拒绝(强调我的)
您需要在公共架构上授予只读用户权限:
GRANT USAGE ON SCHEMA public TO readonlyuser;
ACL 的内容在this page 上进行了解释。此处引用的最相关部分:
rolename=xxxx -- 授予角色的权限 =xxxx -- 授予 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 格式化结果的方式的一部分,它们不是值的一部分。
【讨论】:
谢谢,但它似乎仍然不起作用。sudo -u postgres psql -d datastore_default -U ckan_default -c 'GRANT USAGE ON SCHEMA public TO readonlyuser;' WARNING: no privileges were granted for "public" GRANT
。 \z 打印同样的东西。我有 PostgreSQL 9.1.14 (Ubuntu 12.04 LTS)
我认为当您登录的用户没有足够的权限授予这些权限时,它会发出该消息。您应该拥有 GRANT 权限或者是 public 的所有者或者是超级用户。
谢谢。现在很清楚了。我的印象是 + 有一些特殊的含义。
我有一个 postgres 用户,他是一个无法截断的表的所有者...我在该用户的 ACL 中看到它是:arwdRxt
。这是什么意思,它与arwdDxt
有何不同?我的假设是因为 D
与 R
其中 D
代表 TRUNCATE
。
psql_access_priv_decoder 是一个工具,您可以提供psql
的输出,并以明文形式向您解释访问权限。以上是关于PostgreSQL 权限解释的主要内容,如果未能解决你的问题,请参考以下文章
PostgreSQL:将所有权限授予 PostgreSQL 数据库上的用户