createrole_self_grant 是一个 配置参数,用于确定一个拥有 CREATEROLE 权限的非超级用户创建的角色将自动授予给创建者的特征。
createrole_self_grant 在 PostgreSQL 16 中被添加。
默认值
createrole_self_grant 的默认值为:''(空字符串)。
用法
createrole_self_grant 可以设置为包含以下一个或两个值(后一种情况用逗号分隔)
setinherit
createrole_self_grant 不提供任何额外的权限,但旨在简化角色创建。在 PostgreSQL 16 之前,一个创建其他角色的非超级用户需要手动执行必要的 GRANT 命令,以便为他们创建的任何角色授予 SET 和/或 INHERIT 权限。
按 PostgreSQL 版本详细信息
createrole_self_grant (PostgreSQL 19)
| 设置 | |
| 单位 | |
| 类别 | 客户端连接默认值 / 语句行为 |
| 简短描述 | 设置 CREATEROLE 用户是否自动授予角色给自己,以及具有哪些选项。 |
| 扩展描述 | 空字符串禁用自动自我授予。 |
| 上下文 | user |
| 变量类型 | string |
| 来源 | 默认 |
| 最小值 | |
| 最大值 | |
| 枚举值 | |
| 启动值 | |
| 重置值 | |
| 源文件 | |
| 源行 | |
| 需要重启 | false |
createrole_self_grant (PostgreSQL 18)
| 设置 | |
| 单位 | |
| 类别 | 客户端连接默认值 / 语句行为 |
| 简短描述 | 设置 CREATEROLE 用户是否自动授予角色给自己,以及具有哪些选项。 |
| 扩展描述 | 空字符串禁用自动自我授予。 |
| 上下文 | user |
| 变量类型 | string |
| 来源 | 默认 |
| 最小值 | |
| 最大值 | |
| 枚举值 | |
| 启动值 | |
| 重置值 | |
| 源文件 | |
| 源行 | |
| 需要重启 | false |
createrole_self_grant (PostgreSQL 17)
| 设置 | |
| 单位 | |
| 类别 | 客户端连接默认值 / 语句行为 |
| 简短描述 | 设置 CREATEROLE 用户是否自动授予角色给自己,以及具有哪些选项。 |
| 扩展描述 | |
| 上下文 | user |
| 变量类型 | string |
| 来源 | 默认 |
| 最小值 | |
| 最大值 | |
| 枚举值 | |
| 启动值 | |
| 重置值 | |
| 源文件 | |
| 源行 | |
| 需要重启 | false |
createrole_self_grant (PostgreSQL 16)
| 设置 | |
| 单位 | |
| 类别 | 客户端连接默认值 / 语句行为 |
| 简短描述 | 设置 CREATEROLE 用户是否自动授予角色给自己,以及具有哪些选项。 |
| 扩展描述 | |
| 上下文 | user |
| 变量类型 | string |
| 来源 | 默认 |
| 最小值 | |
| 最大值 | |
| 枚举值 | |
| 启动值 | |
| 重置值 | |
| 源文件 | |
| 源行 | |
| 需要重启 | false |
变更历史
- PostgreSQL 16
- 添加于(提交 e5b8a4c0)
示例
在此 createrole_self_grant 的用法示例中,我们首先创建一个拥有角色管理权限的角色“alice”。
postgres=# CREATE ROLE alice LOGIN CREATEROLE; CREATE ROLE
如果 alice 随后创建另一个角色,默认情况下,在没有额外的 GRANT 语句的情况下,他们将无法为此角色使用 SET ROLE。
postgres=# \c - alice
You are now connected to database "postgres" as user "alice".
postgres=> CREATE ROLE bob LOGIN;
CREATE ROLE
postgres=> \drg
List of role grants
Role name | Member of | Options | Grantor
-----------+-----------+---------+----------
alice | bob | ADMIN | postgres
(1 row)
postgres=> SET ROLE bob;
ERROR: permission denied to set role "bob"
postgres=> GRANT bob TO alice WITH SET OPTION;
GRANT ROLE
postgres=> SET ROLE bob;
SET
通过将 createrole_self_grant 设置为 set,可以避免额外的 GRANT 步骤。
postgres=> DROP ROLE bob;
DROP ROLE
postgres=> SET createrole_self_grant = 'SET';
SET
postgres=> CREATE ROLE bob LOGIN;
CREATE ROLE
postgres=> \drg
List of role grants
Role name | Member of | Options | Grantor
-----------+-----------+---------+----------
alice | bob | SET | alice
alice | bob | ADMIN | postgres
(2 rows)
postgres=> SET ROLE bob;
SET
类似地,inherit 选项也消除了对显式 GRANT ... WITH INHERIT OPTION 的需求。
postgres=> SET createrole_self_grant = 'INHERIT';
SET
postgres=> CREATE ROLE bob LOGIN;
CREATE ROLE
postgres=> \drg
List of role grants
Role name | Member of | Options | Grantor
-----------+-----------+---------+----------
alice | bob | INHERIT | alice
alice | bob | ADMIN | postgres
(2 rows)
参考资料
- PostgreSQL 文档: createrole_self_grant
