PostgreSQL 19: 新增 pg_get_role_ddl () 函数

John Doe 四月 8, 2026

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

image

特性提交日志

新增 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_authidpg_db_role_settingpg_auth_members 系统表,拼接权限、参数、继承关系,极易遗漏 CONNECTION LIMITVALID UNTIL、数据库级参数、角色成员关系等细节,且密码明文暴露风险高。

pg_get_role_ddl () 是原生 SQL 可调用的角色 DDL 生成函数,输入角色名,自动输出:

  1. 完整 CREATE ROLE 语句(含 SUPERUSER、LOGIN、CREATEDB 等所有属性)
  2. 所有 ALTER ROLE ... SET 配置(全局 + 库级参数)
  3. 角色成员关系 GRANT 语句(可选)
  4. 永不输出密码,安全合规
  5. 支持格式化输出,可读性拉满

例如,我们可以直接生成角色的完整重建语句,包含所有属性与配置:

-- 导出 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