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

Supabase授权角色后部分表触发RLS错误,权限一致却异常排查

问题分析与解决

核心原因

PostgreSQL 中,当表启用**行级安全(RLS)**但未定义任何策略时,默认会拒绝所有用户的访问请求(包括拥有表权限的用户)——这就是你操作 campaign、lead 等表报错或查不到数据的直接原因。

而 customer 表能正常操作,大概率是以下两种情况之一:

  • customer 表的 RLS 并未真正启用:虽然 Supabase 控制台显示启用,但可能存在状态不同步,实际数据库中该表的 RLS 是关闭的。
  • myuser 角色拥有 customer 表的 BYPASSRLS 权限:该权限会让用户直接绕过 RLS 限制,无需策略即可操作表。

验证步骤

  1. 检查各表的RLS实际状态
    执行以下SQL确认每个表的RLS是否真的启用:
SELECT relname, relrowsecurity 
FROM pg_class 
WHERE relname IN ('customer', 'campaign', 'lead', 'lead_history', 'log', 'stats');

如果 customer 对应的 relrowsecurity 值为 f,说明该表RLS未启用,因此权限直接生效。

  1. 检查myuser的BYPASSRLS权限
    执行以下SQL查看角色是否拥有绕过RLS的权限:
SELECT rolname, rolbypassrls 
FROM pg_roles 
WHERE rolname = 'myuser';

如果 rolbypassrls 为 t,说明myuser可以跳过RLS限制。

解决方案

根据你的需求选择以下一种方式:

方式1:关闭不需要RLS的表的行级安全

如果不需要对这些表做行级权限控制,直接关闭RLS:

ALTER TABLE campaign DISABLE ROW LEVEL SECURITY;
ALTER TABLE lead DISABLE ROW LEVEL SECURITY;
ALTER TABLE lead_history DISABLE ROW LEVEL SECURITY;
ALTER TABLE log DISABLE ROW LEVEL SECURITY;
ALTER TABLE stats DISABLE ROW LEVEL SECURITY;

方式2:为启用RLS的表添加访问策略

如果需要保留RLS,必须为每个表创建对应的策略,比如允许myuser完全访问的策略:

-- 为campaign表创建全量访问策略
CREATE POLICY "myuser full access to campaign" ON campaign
FOR ALL USING (true)
WITH CHECK (true);

-- 复制上述语句,替换表名给其他表添加策略
CREATE POLICY "myuser full access to lead" ON lead
FOR ALL USING (true)
WITH CHECK (true);

CREATE POLICY "myuser full access to lead_history" ON lead_history
FOR ALL USING (true)
WITH CHECK (true);

CREATE POLICY "myuser full access to log" ON log
FOR ALL USING (true)
WITH CHECK (true);

CREATE POLICY "myuser full access to stats" ON stats
FOR ALL USING (true)
WITH CHECK (true);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 17:12:52