请解释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表和u 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)可以向其他用户授予特定数据库的权限.该模式仅在数据库级别,所以我添加了查看公共模式的权限是可以的,它无论如何都不能从其他数据库中 Select .

推荐答案

错误显示schema public人的许可被拒绝(强调我的)

您需要在公共架构上授予readonlyuser权限:

GRANT USAGE ON SCHEMA public TO readonlyuser;

ACL的内容在第this page页解释.此处引用的最相关部分:

rolename=xxxx——授予角色的权限

        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相关问答推荐

复合索引列的顺序导致不同的计划

如何在Postgres中对分区表使用Hibernate验证?

Rust中使用sqlx的多线程postgres操作的惯用方法是什么?

Gorm 中的更新将created_at、updated_at 作为默认时间

PL/pgSQL中的IP递增函数

使用 pgx 扫描范围类型

在特定距离内创建点的唯一索引

使用来自 docker 图像的 postgres 设置 Keycloak 21

Postgres 低估了导致错误查询计划的行数

PostgreSQL错误致命:角色 username不存在

PG::TRDeadlockDetected:ERROR: deadlock detected

运算符不存在:integer = integer[] 在使用 ANY 的查询中

使用 RPostgreSQL 进行 UTF-8 / Unicode 文本编码

将 PostgreSQL 配置为仅适用于 LOCALHOST 或指定的 ip + 端口

避免 created_at 和 updated_at 由 sequelize 自动生成

如何在数据库表中查找重复条目?

PG::ConnectionBad FATAL:role "Myname" does not exist

PostgreSQL - 必须出现在 GROUP BY 子句中或在聚合函数中使用

从 5 分钟前的表中获取行

postgresql DB中唯一键的正确数据类型是什么?