0

对于我的网站(由 Supabase 提供后端支持),我有内置的 auth.users 表和一个包含电子邮件、用户名和学校文本字段的 public.profiles 表。我创建了一个触发器和函数,当在 中插入新行时,将使用电子邮件作为电子邮件、full_name 作为电子邮件的用户名组件( for )auth.users在 public.profiles 中插入一行,并执行对大学名称的查询从 public.college_emails 表中确定学校(如果某人使用域“@uci.edu”的电子邮件注册,它将在配置文件字段中插入“加州大学欧文分校”。如果它无法将域与学校匹配,它将插入“其他”。myNamemyName@email.comschool

例子:

假设在我的网站上注册了电子邮件“rickAstley@ucla.edu”的用户。将此行添加到auth.users中后,触发器应执行一个函数,该函数将public.profiles使用以下字段添加新行email::rickAstley@ucla.edu,full_name:rickAstley,:school加州大学洛杉矶分校。

这是该函数的当前 Postgres 代码,由 insert on 上的触发器执行auth.users

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;
    
create trigger on_new_user_created
after insert on auth.users
for each row execute procedure public.handle_new_user();

当我使用虚构的 uuid 和学校电子邮件直接执行插入auth.users操作时,例如:

insert into auth.users (id, email) values ('d1d19367-3d0b-d497-9191-18a9d8e37850','myLongName@ucr.edu')

触发器和功能按预期完美执行。但是,如果我尝试将用户添加到auth.users标准方式,通过以访客身份访问网站并注册,我会收到错误消息Database Error Saving New User。这是图像,尽管我怀疑它会有所帮助:

错误

我不明白为什么这段代码在直接插入时可以正常工作,但在使用 Supabase 的 Auth 组件插入时却不行。这是创建注册功能的代码:

<Auth supabaseClient = {supabase} socialLayout = "horizontal" socialButtonSize = "xlarge" />

还有一点需要注意的是,当我使用的函数在函数中执行查询时,例如在第一个句点之前插入电子邮件域的第一部分而不是在public.college_emails. domain "@uci.edu" 将在字段中插入 "uci"school而不是查询全名)。

这就是工作功能:

create or replace function public.handle_new_user() 
returns trigger as $$
begin
  insert into public.profiles (id, email, full_name, school, created_at)
  values (new.id, new.email, SPLIT_PART(new.email, '@', 1), SPLIT_PART(new.email, '@', 2)
,current_timestamp);
  return new;
end;
$$ language plpgsql security definer;

我渴望在这个问题上的任何线索,非常感谢提前。

4

0 回答 0