PostgreSQL 15: public 模式中创建表的权限由 pg_database_owner 拥有

John Doe 六月 27, 2025

你想控制用户在 public 模式中创建表的权限吗?

欢快奔跑的大象

特性提交日志

撤销从 public 模式创建表的权限,现在由 pg_database_owner 拥有。

这将默认访问控制列表 (ACL) 切换为自 CVE-2018-1058 以来文档所推荐的设置。升级将保留任何旧的所有权和 ACL。之前未采纳 2018 年建议的站点应重新审视。从头开始部署新数据库集群的方案可能需要创建模式、授予更多权限等。外部测试套件可能需要此类更新。

讨论:https://postgr.es/m/20201031163518.GB4039133@rfd.leadboat.com

示例

在之前的 PostgreSQL 版本中,默认允许任何用户连接到任何数据库,并在默认创建的 “public” 模式中创建新表(以及视图等)。有一些人认为这会产生安全问题,会将 public 模式删除掉,或者收紧 public 模式的访问权限。

但现在情况发生了变化。在新的 PostgreSQL 版本中,默认情况下,非超级用户账户将无法在非其拥有的数据库的 public 模式中创建表。

让我们来看一下:

CREATE DATABASE x;
CREATE USER test;
CREATE DATABASE test WITH OWNER test;

上面,我们创建了 test 用户和两个数据库,“x” 数据库由超级用户拥有,以及由 test 用户拥有的 “test” 数据库。

当我们进入两个数据库创建表时,结果如下:

$ psql -U test -d x -c 'create table a (b int)'
ERROR:  permission denied for schema public
LINE 1: create table a (b int)
                     ^

$ psql -U test -d test -c 'create table a (b int)'

当然,你仍然可以向 public 模式授予所有权限,以保留以前的行为,但默认情况下,将不再允许在属于其他用户的数据库中创建对象。

非常不错的特性。感谢社区的所有相关人员。

参考

提交日志:https://git.postgresql.org/pg/commitdiff/b073c3ccd06e4cb845e121387a43faa8c68a7b62