对于我的网站(由 Supabase 提供后端支持),我有内置的 auth.users 表和一个包含电子邮件、用户名和学校文本字段的 public.profiles 表。我创建了一个触发器和函数,当在 中插入新行时,将使用电子邮件作为电子邮件、full_name 作为电子邮件的用户名组件( for )auth.users
在 public.profiles 中插入一行,并执行对大学名称的查询从 public.college_emails 表中确定学校(如果某人使用域“@uci.edu”的电子邮件注册,它将在配置文件字段中插入“加州大学欧文分校”。如果它无法将域与学校匹配,它将插入“其他”。myName
myName@email.com
school
例子:
假设在我的网站上注册了电子邮件“rickAstley@ucla.edu”的用户。将此行添加到
auth.users
中后,触发器应执行一个函数,该函数将public.profiles
使用以下字段添加新行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;
我渴望在这个问题上的任何线索,非常感谢提前。