由 John Doe 六月 11, 2025
你想控制和管理数据库的维护权限吗?现在,PostgreSQL 有可授予的维护权限了。
特性提交日志
新增可授予的MAINTAIN
权限与pg_maintain
角色。
允许执行VACUUM
、ANALYZE
、REINDEX
、REFRESH MATERIALIZED VIEW
、CLUSTER
和LOCK TABLE
操作。
以后,不再为VACUUM
、ANALYZE
等维护命令创建单独的权限,而是将它们统一归到单个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