Postgres 15. 对于模式 public 权限被拒绝。

45

非超级用户无法在公共模式下创建表

postgres - 超级用户。

我所做的:

ALTER SCHEMA public owner to postgres;  

CREATE USER admin WITH PASSWORD 'my-password';   

GRANT USAGE, CREATE ON SCHEMA public TO postgres;   
GRANT USAGE, CREATE ON SCHEMA public TO admin;    

CREATE DATABASE mydb;    
GRANT ALL ON DATABASE mydb TO admin;

权限:

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

我得到了什么:

enter image description here

如何在公共模式中创建表?


12
PostgreSQL 15同时从公共(或默认)模式中撤销了所有用户的CREATE权限,除非是数据库所有者。 - Richard Huxton
"postgres" 是数据库的所有者。 "postgres" 是模式 "public" 的所有者。 \dn+ 显示管理员对模式具有完全访问权限,但这对我不起作用。 - Merkalov Anton
2个回答

97

第一篇评论指出了最可能发生这种情况的原因。引用发布公告

PostgreSQL 15还从 public (或默认)模式中撤销了除数据库所有者之外的所有用户的 CREATE 权限。

您的修复失败的原因是您对数据库 postgres 上关于用户 admin 在模式 public 上特权的所有操作仅涉及该数据库中的模式。在新创建的 mydb 中,模式 public 与数据库 postgres 上的模式 public 不同。

此外,还有:

GRANT ALL ON DATABASE mydb TO admin;

授予特权对数据库本身进行操作,而不是数据库中的内容。例如,admin 现在可以删除数据库,但仍然无法在模式 public 中创建表。我猜想您希望将 admin 设为 mydb 的所有者,这样您需要添加:

ALTER DATABASE mydb OWNER TO admin;

或者你需要在mydb上重复执行GRANT USAGE, CREATE ON SCHEMA public TO admin;

这是关于安全架构使用模式的更多文档,PostgreSQL 15变更就是基于这些内容。


1
谢谢!我知道public是不同的。我如何在“mydb”上执行以下命令: GRANT USAGE, CREATE ON SCHEMA public TO admin; 对于public模式?如果我的问题很愚蠢,请原谅)ALTER DATABASE mydb OWNER TO admin; 这个命令可以工作,但不是我想要的。 - Merkalov Anton
根据您使用的数据库客户端/IDE,您可能需要创建新连接。不过,无论您目前连接到哪个名为“postgres”的数据库,您都应该再次执行相同的步骤,并在连接设置中将数据库名称替换为“mydb”。一旦进入系统,您可以通过发出“select current_database(),current_user;”来确保。 - Zegarek
非常感谢。它起作用了!postgres=# \c myDBmyDB=# GRANT USAGE, CREATE ON SCHEMA public TO admin; - Merkalov Anton
特别感谢,我在这个问题上卡了两天,keycloak 无法访问 public schema - Askar
您可能还需要执行以下操作: GRANT ALL PRIVILEGES ON TABLESPACE tsname TO username; - Putnik

1

在授予public模式的权限之后,您已经创建了数据库。很有可能您的admin用户正在使用新的数据库,该数据库仅具有默认权限。


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