由 John Doe 八月 15, 2025
你想控制和管理关系表的维护权限吗?现在,PostgreSQL 有可授予的维护权限了。
特性提交日志
引入 MAINTAIN 权限和 pg_maintain 预定义角色。
对某个关系拥有 MAINTAIN 权限的角色,可以对该关系执行VACUUM
、ANALYZE
、REINDEX
、REFRESH MATERIALIZED VIEW
、CLUSTER
和LOCK TABLE
操作。
拥有pg_maintain
角色权限的角色,可以对所有关系执行上述相同的命令。
讨论:https://postgr.es/m/20240305161235.GA3478007%40nathanxps13
示例
从 PostgreSQL 17 开始,关系表的维护操作可以授权给非超级用户。下面通过一个简单的设置来演示所做的改进:
CREATE USER u WITH PASSWORD 'u' LOGIN;
CREATE USER v WITH PASSWORD 'v' LOGIN;
CREATE SCHEMA su AUTHORIZATION u;
\c postgres u
You are now connected to database "postgres" as user "u".
CREATE TABLE su.t ( a int, b text );
CREATE UNIQUE INDEX i ON su.t(a);
CREATE MATERIALIZED VIEW su.mv AS SELECT * FROM su.t;
这里创建了两个用户,其中一个用户拥有一个模式,该模式包含一张表、一个唯一索引和一个物化视图。在 PostgreSQL 之前的版本中,可以将对象的清理和分析权限授予另一个用户,但此前的方式已不再适用:
grant analyze on su.t to v;
ERROR: syntax error at or near "analyze"
现在,维护操作的权限不再单独授予,而是整合到一个统一的权限中:
GRANT MAINTAIN ON su.t TO v;
GRANT MAINTAIN ON su.mv TO v;
GRANT USAGE ON SCHEMA su TO v;
“MAINTAIN” 权限包含以下这些权限:
- VACUUM
- ANALYZE
- REINDEX
- REFRESH MATERIALIZED VIEW
- CLUSTER
- LOCK TABLE
拥有该权限后,所有这些操作都可以被委托执行:
ANALYZE su.t;
REFRESH MATERIALIZED VIEW su.mv;
REINDEX INDEX su.i;
此外,还新增了一个pg_maintain
角色,该角色默认授予所有上述操作的权限:
\c postgres u
You are now connected to database "postgres" as user "u".
CREATE TABLE su.x ( a int );
\c postgres postgres
You are now connected to database "postgres" as user "postgres".
GRANT pg_maintain TO v;
\c postgres v
You are now connected to database "postgres" as user "v".
ANALYZE su.x;
非常不错的改进,因为它进一步减少了需要超级用户权限的任务。
感谢社区的所有相关人员。
参考
提交日志:https://git.postgresql.org/pg/commitdiff/ecb0fd33720fab91df1207e85704f382f55e1eb7