如何在Supabase中限制数组大小并验证ID有效性?
仅用Supabase实现收藏列表的ID验证与大小限制
完全可以只依靠Supabase实现你的需求,不需要额外搭建网关API。以下是具体的实现方案,通过数据库触发器和RLS策略组合完成所有校验:
1. 限制收藏列表大小(≤100条)
通过数据库触发器在插入/更新用户收藏数据时直接校验数组长度,超出限制则抛出错误:
-- 创建校验函数 CREATE OR REPLACE FUNCTION check_favorites_size() RETURNS TRIGGER AS $$ BEGIN IF array_length(NEW.favorites, 1) > 100 THEN RAISE EXCEPTION '收藏列表最多只能包含100条内容'; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql; -- 给用户表绑定触发器(假设用户表名为profiles,收藏字段为favorites) CREATE TRIGGER validate_favorites_size_before_insert BEFORE INSERT ON profiles FOR EACH ROW EXECUTE FUNCTION check_favorites_size(); CREATE TRIGGER validate_favorites_size_before_update BEFORE UPDATE OF favorites ON profiles FOR EACH ROW EXECUTE FUNCTION check_favorites_size();
2. 验证收藏ID存在于数据库
同样用触发器实现批量ID校验,确保数组中每个ID都存在于content_series表(存储内容系列的表):
CREATE OR REPLACE FUNCTION validate_favorite_ids() RETURNS TRIGGER AS $$ BEGIN -- 检查数组中是否有不存在的ID IF EXISTS ( SELECT 1 FROM unnest(NEW.favorites) AS fav_id WHERE fav_id NOT IN (SELECT id FROM content_series) ) THEN RAISE EXCEPTION '部分收藏ID在数据库中不存在'; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql; -- 绑定到用户表的插入/更新操作 CREATE TRIGGER validate_favorite_ids_before_insert BEFORE INSERT ON profiles FOR EACH ROW EXECUTE FUNCTION validate_favorite_ids(); CREATE TRIGGER validate_favorite_ids_before_update BEFORE UPDATE OF favorites ON profiles FOR EACH ROW EXECUTE FUNCTION validate_favorite_ids();
3. 结合RLS确保数据安全
最后配置RLS策略,保证用户只能修改自己的收藏数据:
-- 启用用户表的RLS ALTER TABLE profiles ENABLE ROW LEVEL SECURITY; -- 允许用户更新自己的收藏 CREATE POLICY "用户仅能修改自身收藏" ON profiles FOR UPDATE USING (auth.uid() = id) WITH CHECK (auth.uid() = id); -- 允许用户插入自己的记录(如果需要) CREATE POLICY "用户仅能插入自身记录" ON profiles FOR INSERT WITH CHECK (auth.uid() = id);
客户端处理
当用户通过Supabase客户端更新收藏列表时,数据库会自动执行上述校验,若不符合要求会抛出异常,你只需在客户端捕获这些异常并提示用户即可。
这种方案所有校验逻辑都在数据库层面完成,无需额外网关,既保证了数据一致性,又简化了架构。
内容的提问来源于stack exchange,提问作者Oxey405
相关产品推荐
相关产品推荐

