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

PostgreSQL 14中RLS策略已启用但未生效问题求助

PostgreSQL 14 RLS不生效的解决思路

核心原因

表的所有者默认绕过行级安全(RLS)策略。你使用的postgres用户是employee表的所有者,因此即使启用了RLS并创建了隔离策略,查询时也会直接跳过规则,返回所有行。

解决办法

方法1:使用非所有者用户测试RLS

这是最符合生产场景的验证方式(生产中通常不会用表所有者直接操作业务数据):

  1. 创建普通测试用户并授权:
CREATE USER test_user WITH PASSWORD 'test_password';
GRANT SELECT ON public.employee TO test_user;
  1. 切换到该用户执行查询:
SET ROLE test_user;
SET app.tenant_id to 'tenant1';
SELECT * FROM employee;

此时会严格应用RLS策略,仅返回tenant1对应的行。

方法2:强制表所有者遵守RLS(谨慎使用)

如果需要让表所有者也受RLS约束(比如测试场景),可以执行:

ALTER TABLE public.employee FORCE ROW LEVEL SECURITY;

执行后,用postgres用户再次查询,就会应用租户隔离策略,只返回匹配的行。

验证RLS状态

可以通过以下SQL确认表的RLS配置:

SELECT relname, relrowsecurity, relforcerowsecurity 
FROM pg_class 
WHERE relname = 'employee';
  • relrowsecurity = t:表示已启用RLS
  • relforcerowsecurity = t:表示强制所有者也遵守RLS

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 00:35:33