我有一个用户 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权限来访问此数据库。
导入的转储文件有什么问题吗? 有人知道如何解决这个问题吗?
c
在权限中代表什么,这样我就可以单独添加它,而不是添加所有我不想要的权限? - user5051092c
代表CREATE
,u
代表USAGE
。这些是模式支持的唯一权限。 - A.H.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