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

Supabase Auth注册时Postgres触发器报Database Error Saving New User错误

问题根因

  1. 触发器函数缺少security definer声明:默认情况下PostgreSQL函数会以触发操作的用户权限运行,你手动插入auth.users时使用的是数据库高权限账号,有权限查询public.college_emails表;但通过Supabase Auth组件注册用户时,触发插入操作的是Supabase内置的低权限Auth角色,没有public.college_emails的查询权限,触发函数执行到SELECT查询步骤就会抛出权限错误。
  2. 原函数代码存在语法缺失:函数定义结束后缺少$$ language plpgsql;声明,虽然手动执行时可能未触发报错,但在Supabase Auth的触发上下文里会被校验拦截。
  3. 若你为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:06:03