PostgreSQL权限解释

ddr*_*ian 12 postgresql

请解释\zPostgreSQL中命令的输出.我理解了许可,我阅读了文档,但不知怎的,我错过了输出的解释\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      +| 
Run Code Online (Sandbox Code Playgroud)

不知何故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
Run Code Online (Sandbox Code Playgroud)

编辑:显然我对数据库和架构权限的工作方式了解不足.首先,只有db admin(用户postgres)或数据库的所有者(在我的情况下,用户ckan_default)可以授予其他用户对特定数据库的权限.架构仅在数据库级别,因此我可以添加readonlyuser查看公共架构的权限,但无论如何都无法从其他数据库中进行选择.

Eel*_*lke 28

该错误表示对模式公众的权限被拒绝(强调我的)

您需要在schema public上授予readonlyuser权限:

GRANT USAGE ON SCHEMA public TO readonlyuser;
Run Code Online (Sandbox Code Playgroud)

ACL的内容在此页面上说明.这里引用最相关的部分:

rolename = xxxx - 授予role = 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
Run Code Online (Sandbox Code Playgroud)

+是psql格式化结果的方式的一部分,它们不是值的一部分.

  • 谢谢,但它似乎仍然无法正常工作.`sudo -u postgres psql -d datastore_default -U ckan_default -c'使用SCHEMA public to readonlyuser;' 警告:没有为"公共"GRANT授予特权.\ z打印相同的东西.我有PostgreSQL 9.1.14(Ubuntu 12.04 LTS) (3认同)
  • [psql_access_priv_decoder](https://github.com/tpo/little_shell_scripts#psql_access_priv_decoder) 是一个可以提供 `psql` 输出的工具,它将以明文形式向您解释访问权限。 (3认同)
  • 我认为当您登录的用户没有足够的权限授予这些权限时,它会给出该消息.您应该拥有GRANT权限,或者是公共所有者或超级用户. (2认同)
  • 谢谢。现在很清楚了。我的印象是+有一些特殊的含义。 (2认同)