PostgreSQL 15分区表权限配置:限制用户仅更新指定分区
分区表权限控制:仅允许用户通过父表更新指定分区
原操作失效原因
在PostgreSQL中,对分区父表执行DML操作时,权限校验仅针对父表本身,不会在查询规划阶段提前检查目标子分区的权限。只要用户拥有父表的UPDATE权限,即使没有对应子分区的权限,UPDATE父表的语句也会被允许——后续路由到子分区执行时不会再做权限校验,这就是my_user能更新data_v1分区的核心原因。
正确配置步骤
要实现用户仅能通过父表更新指定分区,需结合撤销父表权限、子分区权限授予和行级安全策略(RLS),具体操作如下:
- 撤销
my_user对父表data的UPDATE权限
REVOKE UPDATE ON data FROM my_user;
- 确保
my_user拥有目标分区data_v0的UPDATE权限(原配置已完成,可重复执行确认)
GRANT UPDATE ON data_v0 TO my_user;
- 为父表启用行级安全,并创建策略限制
my_user仅能操作version='v0'的行
-- 开启父表的行级安全 ALTER TABLE data ENABLE ROW LEVEL SECURITY; -- 创建策略:允许my_user查看、更新version为'v0'的行 CREATE POLICY data_v0_access_policy ON data FOR ALL TO my_user USING (version = 'v0') WITH CHECK (version = 'v0');
验证效果
以my_user身份登录后执行以下操作:
- 正常执行(更新
data_v0分区):
UPDATE data SET payload = 'user update' WHERE version = 'v0';
- 执行失败(无匹配行或权限拦截):
UPDATE data SET payload = 'user update' WHERE version = 'v1';
- 直接操作
data_v1分区报错(权限不足):
UPDATE data_v1 SET payload = 'user update';
内容的提问来源于stack exchange,提问作者tok
相关产品推荐
相关产品推荐

