如何通过RLS策略限制Supabase支付表重复插入及禁用套餐支付?
问题原因及解决办法
你的重复支付限制不生效,核心原因是RLS子查询的权限限制:当你在payments表的WITH CHECK策略中查询同表的现有记录时,当前用户可能没有权限读取这些记录,导致子查询无法找到已存在的成功支付记录,从而让NOT EXISTS条件始终为真,允许重复插入。
另外,原策略中直接使用payments.bundle_id容易产生歧义,建议明确使用NEW关键字指代待插入的新行字段,提升可读性和准确性。
具体修复步骤
- 添加
payments表的SELECT策略,确保用户能读取自己的支付记录:
CREATE POLICY "用户可查看自己的支付记录" ON payments FOR SELECT USING (user_id = auth.uid());
- 修改
WITH CHECK策略,用NEW明确引用新行字段,并简化条件逻辑:
WITH CHECK ( user_id = auth.uid() AND NOT EXISTS ( SELECT 1 FROM bundles WHERE bundles.id = NEW.bundle_id AND bundles.is_disabled = true ) AND NOT EXISTS ( SELECT 1 FROM payments p WHERE p.user_id = auth.uid() AND p.bundle_id = NEW.bundle_id AND p.is_successful = true ) )
这样修改后,子查询就能正常获取到用户已有的成功支付记录,重复支付的限制会生效,同时保留禁用套餐的限制逻辑。
内容的提问来源于stack exchange,提问作者PhyDev
相关产品推荐
相关产品推荐

