0

对于我的 Nextjs 网站,我将后端配置为在向 auth.users 表中插入一行时自动将用户信息添加到 public.profiles 表中(通过 Supbase 的身份验证自动完成)。

我有一个 public.college_emails 表,其中包含 1700 多所大学的名称以及与它们关联的电子邮件标签。当用户使用他们的学校电子邮件创建帐户时,我希望它返回与他们的电子邮件标签关联的大学名称,并将其输入到他们的“学校”字段中。否则,如果他们使用不在我列表中的电子邮件,它将插入“其他”。

我能够让 Supbase 编译我的 SQL 而没有语法错误,但是在尝试添加新用户时,它失败并出现错误Database error when creating user。(我发现这是当与用户创建相关的触发器或函数出现问题时。当我删除执行前面提到的功能的代码时,它工作正常(但只是没有正确选择大学名称。

这是我的 PostgreSQL 代码不起作用。它没有报告语法错误,但在尝试插入用户时失败:

create table if not exists public.profiles (
id uuid not null primary key, -- UUID from auth.users
email text,
full_name text,
avatar_url text,
created_at timestamp with time zone
);
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), 
  (SELECT coalesce(college, 'Other') FROM college_emails WHERE tag = SPLIT_PART(new.email, '@', 2)) // THIS LINE DOES NOT WORK
  ,current_timestamp);
  return new;
end;
$$ language plpgsql security definer;

create trigger on_new_user_created
  after insert on auth.users
  for each row execute procedure public.handle_new_user();

我的大学表格式如下:

email (text): 'example@mycollege.edu'; college (text): 'My College'; tag (text): 'mycollege.edu'

这就是我现在的功能(恢复为工作版本以继续测试)。这缺少添加正确大学名称的代码。表和触发器保持不变:

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(SPLIT_PART(new.email, '@', 2), '.', 1)
  ,current_timestamp);
  return new;
end;
$$ language plpgsql security definer;

我的预期结果:

使用电子邮件“myname@uci.edi”的用户注册并添加到 auth.users。public.profiles 中添加了一个新行,其中包含电子邮件:“myname@uci.edu”、用户名:“myname”和school: "University of California Irvine"

4

1 回答 1

1

像这样更新您的触发功能public.handle_new_user()

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)
  SELECT  new.id, new.email, SPLIT_PART(new.email, '@', 1), coll, current_timestamp ;
  return new;
end;
$$ language plpgsql security definer;
于 2021-11-26T17:01:40.117 回答