PostgreSQL 18: 获取数据库对象访问控制列表的函数 pg_get_acl

John Doe 十月 31, 2025

你想要知道 PostgreSQL 中某个数据库对象的访问控制列表吗?

image

特性提交日志

添加 pg_get_acl() 函数,以获取数据库对象的访问控制列表(ACL)。

该函数可返回数据库对象的访问控制列表(ACL),对象通过“系统表 OID”和“对象 OID”指定。

当与pg_depend(对象依赖关系表)或pg_shdepend(共享对象依赖关系表)进行关联查询时,此函数能便捷地获取“由(class_id, objid)二元组指定的对象”所关联的访问权限控制列表,这与其他用于对象标识的函数(如通过类似二元组定位对象的函数)的使用逻辑一致,因此具有较高实用性。

讨论:https://postgr.es/m/80b16434-b9b1-4c3d-8f28-569f21c2c102@app.fastmail.com

示例

PostgreSQL 18 引入了一个新函数 pg_get_acl(),该函数可用于获取和查看与数据库对象相关联的权限。

以下是一个示例:

-- 创建名为 foo 的表,含 id(整数类型)字段
CREATE TABLE foo (id INT);

-- 创建名为 bar 的角色
CREATE ROLE bar;

-- 授予 bar 角色对 foo 表的 SELECT(查询)权限
GRANT SELECT ON foo TO bar;

-- 创建名为 baz 的角色
CREATE ROLE baz;

-- 授予 baz 角色对 foo 表的 UPDATE(更新)权限
GRANT UPDATE ON foo TO baz;

SELECT unnest(pg_get_acl('pg_class'::regclass, 'foo'::regclass, 0));
           unnest           
----------------------------
 postgres=arwdDxtm/postgres  -- 表所有者postgres拥有全部权限(arwdDxtm为权限标识集合)
 bar=r/postgres              -- bar角色拥有r(SELECT,查询)权限
 baz=w/postgres              -- baz角色拥有w(UPDATE,更新)权限
(3 rows)

上面的 unnest() 函数,将pg_get_acl()返回的数组结果拆分为多行,便于查看。

输出结果中=后的字符代表具体权限,常见标识有:r = SELECT(查询权限)、w = UPDATE(更新权限)、a = INSERT(插入权限)、d = DELETE(删除权限)等,完整权限集合可参考 PostgreSQL 官方文档。

在上述示例中可以看到,bar角色获得了查询权限,baz角色获得了更新权限。

非常不错的新特性,这将会给运维人员的工作带来很多方便。感谢社区的所有相关人员。

参考

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