PostgreSQL数据库所有者无法访问数据库-"未找到关系。"

35

我有一个用户 user_x,在postgresql上拥有一个数据库,但没有任何 ROLE 属性,比如(CREATE_DB、SUPERUSER等)。

这个 user_x 可以访问整个数据库,创建表(在他的数据库中),选择、插入和更新数据。

我有一个数据库列表:

mydatabase=> \l
                                     List of databases
          Name           |  Owner   | Encoding  | Collation | Ctype |   Access privileges   
-------------------------+----------+-----------+-----------+-------+-----------------------
 postgres                | postgres | SQL_ASCII | C         | C     | 
 mydatabase              | user_x   | UTF8      | C         | C     | 
 template0               | postgres | SQL_ASCII | C         | C     | =c/postgres          +
                         |          |           |           |       | postgres=CTc/postgres
 template1               | postgres | SQL_ASCII | C         | C     | =c/postgres          +
                         |          |           |           |       | postgres=CTc/postgres
 whoami                  | postgres | SQL_ASCII | C         | C     | 
(6 rows)

以及以下角色:

mydatabase=> \du
                       List of roles
 Role name |            Attributes             | Member of 
-----------+-----------------------------------+-----------
 postgres  | Superuser, Create role, Create DB | {}
 user_x    |                                   | {}

mydatabase=> \d
                        List of relations
 Schema |               Name                |   Type   |  Owner   
--------+-----------------------------------+----------+----------
 public | addresses                         | table    | user_x
 public | addresses_id_seq                  | sequence | user_x
 public | assignments                       | table    | user_x
 public | assignments_id_seq                | sequence | user_x

 ...

没问题,直到我将数据导出并在另一个postgresql服务器上恢复。

在另一个服务器(使用相同的数据库名称和用户)上导入数据后,登录psql并执行\d命令时,回复"No relations found."

因此,我在导入的数据库服务器上为user_x添加了SUPERUSER角色,然后user_x就可以再次查看关系和数据了。

但是user_x不需要具有SUPERUSER权限来访问此数据库。

导入的转储文件有什么问题吗? 有人知道如何解决这个问题吗?

2个回答

78

也许 public 模式的模式权限被破坏了。请问在两个站点上执行 \dn+ 的输出是什么?

输出应该类似于这样:

                          List of schemas
  Name  |  Owner   |  Access privileges   |      Description       
--------+----------+----------------------+------------------------
 public | postgres | postgres=UC/postgres | standard public schema
                   : =UC/postgres           
(1 row)

如果缺少=UC/postgres部分,您可以使用以下方式恢复它:

grant all on schema public to public;

你好,A.H. 必须拥有忍者技能。你是对的!访问权限为空。 - AndreDurao
7
非常感谢你让我重获这三个小时的时间! - cjauvin
c在权限中代表什么,这样我就可以单独添加它,而不是添加所有我不想要的权限? - user5051092
@WorstForum:c代表CREATEu代表USAGE。这些是模式支持的唯一权限。 - A.H.
我遇到了相同的问题,但是在RDS上无法运行grant all命令。有什么想法吗? - gillien
6
实际上,在安全性方面,给予 GRANT ALL ON SCHEMA public TO public 并不是一个好主意,因为它会将 public 模式的使用和创建权限授予所有用户。也许使用 GRANT USAGE ON SCHEMA public TO user_x; 就足够了。我在这里找到了对“访问权限”列的详细解释:https://severalnines.com/blog/postgresql-privileges-and-security-locking-down-public-schema - SebaGra

1

没有找到任何关系。

如果您的数据库没有表,您也会得到这个错误提示。

iripmu=# select * from testtable;
 id |    Name
----+------------
  1 | Bear
  2 | Tiger
(2 rows)

iripmu=# drop table if exists testtable;
DROP TABLE
iripmu=# \dt
Did not find any relations.

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