我有一个来自 PostgreSQL 15 的备份,我正在尝试将其导入到 PostgreSQL 16 中。版本之间的重大更改之一是“限制 CREATEROLE 的权限及其修改其他角色的能力”
以前,具有 CREATEROLE 权限的角色可以更改任何非超级用户角色的许多方面。此类更改(包括添加成员)现在要求请求更改的角色具有 ADMIN OPTION 权限。
这意味着以前的数据库转储有角色授予命令抛出错误。sql 是通过以下方式获得的pg_dumpall --roles-only
(--no-owner
没有效果):
GRANT role TO user1 GRANTED BY user0;
ERROR: permission denied to grant privileges as role "user0"
DETAIL: The grantor must have the ADMIN option on role "role".
我尝试过使用管理员授予角色,这样当我们将来尝试授予角色时就不会出现此问题,但它会使命令乱序,因此它们在恢复时仍然失败:
GRANT role TO user1 GRANTED BY user0;
GRANT role TO user2 GRANTED BY user0;
GRANT role TO user3 GRANTED BY user0;
GRANT role TO user0 WITH ADMIN OPTION GRANTED BY [me];
GRANTED BY
除了梳理 PostgreSQL 15 中的权限以便导入时没有问题之外,还有什么方法可以省略命令中的 或任何其他方法来解决此问题?
编辑:user0 已经是超级用户
您有两个选择:
在转储角色之前,在旧数据库中显式
WITH GRANT OPTION
授予角色:user0
然后转储将包含
并且恢复将正常进行。
我在 PostgreSQL v15 上尝试过,然后转储并恢复到 v16。
从 v16 开始使用
pg_dumpall
来转储角色。然后恢复应该可以正常进行,不会出现错误。