Supabase Auth注册时Postgres触发器报Database Error Saving New User错误
问题根因
- 触发器函数缺少
security definer声明:默认情况下PostgreSQL函数会以触发操作的用户权限运行,你手动插入auth.users时使用的是数据库高权限账号,有权限查询public.college_emails表;但通过Supabase Auth组件注册用户时,触发插入操作的是Supabase内置的低权限Auth角色,没有public.college_emails的查询权限,触发函数执行到SELECT查询步骤就会抛出权限错误。 - 原函数代码存在语法缺失:函数定义结束后缺少
$$ language plpgsql;声明,虽然手动执行时可能未触发报错,但在Supabase Auth的触发上下文里会被校验拦截。 - 若你为
public.college_emails开启了行级安全(RLS)但未配置对应的查询策略,也会导致无权限角色无法查询表数据。
修复方案
第一步:修正触发器函数定义,添加权限声明
create or replace function public.handle_new_user() returns trigger as $$ declare coll text ; begin SELECT college INTO coll FROM college_emails WHERE tag = SPLIT_PART(new.email, '@', 2); IF NOT FOUND THEN coll = 'Other' ; END IF ; INSERT INTO public.profiles (id, email, full_name, school, created_at) values (new.id, new.email, SPLIT_PART(new.email, '@', 1), coll, current_timestamp) ; return new; end; $$ language plpgsql security definer; -- 补充缺失的语言声明和安全定义
security definer会让函数以创建者(通常是数据库高权限账号)的权限运行,不受触发用户的权限限制。
第二步:可选配置college_emails表权限
如果public.college_emails开启了RLS,可根据业务需要添加查询策略(不需要对外暴露表的情况下可以不添加,security definer配置已支持函数访问表):
create policy "Allow read access to college_emails" on public.college_emails for select to public using (true);
第三步:重新绑定触发器
drop trigger if exists on_new_user_created on auth.users; create trigger on_new_user_created after insert on auth.users for each row execute procedure public.handle_new_user();
内容的提问来源于stack exchange,提问作者Ryan Millares
相关产品推荐
相关产品推荐

