You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL行级安全策略未生效,设置using(null)仍返回全部行

嘿,这个问题我之前也碰到过,核心是PostgreSQL视图的安全执行上下文在搞鬼!

问题根源

你设置的行级安全策略本身没问题,但默认情况下,PostgreSQL的视图会以视图创建者的身份去访问底层表,而不是当前执行查询的anonymous角色。

看你的操作流程:

  • 你用拥有超级权限的用户(比如默认的postgres)创建了api.mytable视图
  • 给anonymous授权查询这个视图
  • 虽然private.mytable开启了行级安全,且策略是using (null),但当anonymous查视图时,视图实际是用创建者的超级用户身份去读private.mytable——而超级用户默认不受行级安全策略约束,所以策略完全没生效,自然返回了所有行。

两种修复方案

方案一:让视图以当前用户身份执行

修改视图的创建语句,添加SECURITY INVOKER属性,这样视图会用当前查询用户的身份去访问底层表:

create view api.mytable with (security invoker) as select * from private.mytable;

当anonymous查询这个视图时,就会以anonymous的身份读取private.mytable,这时行级安全策略using (null)就会生效,过滤掉所有行,符合你的预期。

方案二:强制超级用户遵守行级安全

如果你不想修改视图,也可以给private.mytable开启force_row_level_security,让超级用户也必须遵守行级安全策略:

alter table private.mytable force row level security;

这样哪怕视图用超级用户身份查询表,也会被using (null)的策略限制,返回空结果。

验证

修改后重新执行查询:

set role anonymous;
select * from api.mytable;

这次就会返回空结果啦。

内容的提问来源于stack exchange,提问作者Alex Kubica

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:36:37