由 John Doe 四月 8, 2026
MySQL 用户经常会使用 SHOW CREATE USER 语句,显示用于创建指定用户的 CREATE USER 语句。现在 PostgreSQL 也有了原生的 SQL 函数,一行命令即可生成角色完整重建的 DDL。

特性提交日志
新增 pg_get_role_ddl () 函数。
新增一个可通过 SQL 调用的函数,用于返回重建一个角色所需的 DDL 语句。该函数接收一个 regrole 类型的参数,以及一个可选的 VARIADIC 的 text 类型参数,用于指定以 “名称 / 值” 交替形式给出的选项。
当前支持以下选项:
- pretty(布尔类型):用于格式化输出
- memberships(布尔类型):用于包含角色成员关系及成员选项的 GRANT 语句
函数返回一行或多行结果:第一行为 CREATE ROLE 语句,后续行为用于设置部分角色属性的 ALTER ROLE 语句。
输出内容永远不会包含密码信息。
调用者必须拥有对 pg_authid 表的 SELECT 权限。
讨论:https://postgr.es/m/4c5f895e-3281-48f8-b943-9228b7da6471@gmail.com
特性示例
以往导出 / 重建角色,需手动查询 pg_authid、pg_db_role_setting、pg_auth_members 系统表,拼接权限、参数、继承关系,极易遗漏 CONNECTION LIMIT、VALID UNTIL、数据库级参数、角色成员关系等细节,且密码明文暴露风险高。
pg_get_role_ddl () 是原生 SQL 可调用的角色 DDL 生成函数,输入角色名,自动输出:
- 完整
CREATE ROLE语句(含 SUPERUSER、LOGIN、CREATEDB 等所有属性) - 所有
ALTER ROLE ... SET配置(全局 + 库级参数) - 角色成员关系 GRANT 语句(可选)
- 永不输出密码,安全合规
- 支持格式化输出,可读性拉满
例如,我们可以直接生成角色的完整重建语句,包含所有属性与配置:
-- 导出 app_admin 角色
SELECT pg_get_role_ddl('app_admin');
输出结果:
CREATE ROLE app_admin WITH NOSUPERUSER INHERIT NOCREATEROLE CREATEDB LOGIN NOREPLICATION NOBYPASSRLS;
ALTER ROLE app_admin IN DATABASE app_db SET search_path TO app_schema,public;
GRANT db_owner TO app_admin WITH ADMIN FALSE, INHERIT TRUE, SET FALSE GRANTED BY postgres;
非常不错的体验,感谢所有参与的社区人员。
参考
提交日志:https://git.postgresql.org/pg/commitdiff/76e514ebb4b55f95b844e3e94e61fa64ab16fd0b