对于我的 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"