PostgreSQL 16: 可授予的维护权限与 pg_maintain 角色

John Doe 六月 11, 2025

你想控制和管理数据库的维护权限吗?现在,PostgreSQL 有可授予的维护权限了。

非洲肯尼亚草原上的一头大象

特性提交日志

新增可授予的MAINTAIN权限与pg_maintain角色。

允许执行VACUUMANALYZEREINDEXREFRESH MATERIALIZED VIEWCLUSTERLOCK TABLE操作。

以后,不再为VACUUMANALYZE等维护命令创建单独的权限,而是将它们统一归到单个MAINTAIN权限下。

  • 讨论:https://postgr.es/m/20221212210136.GA449764@nathanxps13
  • 讨论:https://postgr.es/m/45224.1670476523@sss.pgh.pa.us

示例

到目前为止,如果需要在 PostgreSQL 中运行一些维护任务,通常会使用postgres或其他超级用户账号,通过定时任务调度执行。这可能会引发问题,这意味着多了一个可能被恶意攻击的账号。但这种情况现在得到了改变。

让我们来看看具体能做什么。在我们测试的数据库中,有一个名为buildings的表:

redrock=> \dt buildings
          List of relations
 Schema |   Name    | Type  |  Owner
--------+-----------+-------+---------
 public | buildings | table | redrock
(1 row)

redrock=> \dp buildings
                               Access privileges
 Schema |   Name    | Type  | Access privileges | Column privileges | Policies
--------+-----------+-------+-------------------+-------------------+----------
 public | buildings | table |                   |                   |
(1 row)

未授予任何权限,一切正常。现在,创建一个测试维护用户:

CREATE USER maint;

如果使用maint用户连接到数据库,将无法访问这些表:

SELECT * FROM buildings;
ERROR:  permission denied for table buildings

VACUUM buildings;
WARNING:  permission denied to vacuum "buildings", skipping it

但如果将pg_maintain角色授予这个新用户:

GRANT pg_maintain TO maint;

此时可以对表执行VACUUM操作:

$ psql -U maint -d redrock -X -c 'vacuum buildings'

但仍然无法从表中读取数据:

$ psql -U maint -d redrock -X -c 'select * from buildings'
ERROR:  permission denied for table buildings

正如提交信息所述,该权限允许通过低权限的维护账号执行以下任意操作:

非常不错的体验。感谢社区的所有相关人员。

参考

提交日志:https://git.postgresql.org/pg/commitdiff/60684dd834a222fefedd49b19d1f0a6189c1632e