PostgreSQL权限解释

29

请解释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添加了访问public模式的权限是可以的,因为它无论如何都不能从其他数据库中进行选择。


我在我的回答中添加了一些关于读取ACL的细节。 - Eelke
1个回答

55
错误显示拒绝了 schema public 的权限(强调是我的)
您需要给 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格式化结果的一部分,它们不是值的一部分。


3
谢谢,但它似乎仍然无法工作。 sudo -u postgres psql -d datastore_default -U ckan_default -c 'GRANT USAGE ON SCHEMA public TO readonlyuser;'。 警告:没有为“public”授予任何特权。执行\z命令的输出与此相同。我正在使用PostgreSQL 9.1.14(Ubuntu 12.04 LTS)。 - ddreian
7
当您登录的用户没有足够的权限授予某些权限时,系统会提示该信息。您需要具备GRANT特权或者是public的所有者,或者是超级用户。 - Eelke
2
谢谢。现在很清楚了。我之前以为加号有特殊的意义。 - ddreian
我有一个 Postgres 用户,他是一张表的所有者,但无法对其进行截断... 我在该用户的 ACL 中看到:arwdRxt。这是什么意思,它与 arwdDxt 有何不同?我的假设是这是因为 D vs R 的区别,其中 D 代表 TRUNCATE - tamjd1
3
psql_access_priv_decoder 是一个工具,可以将 psql 命令的输出输入该工具中,它将以清晰易懂的文本方式解释访问权限。 - Tomáš Pospíšek
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接