创建Supabase触发器函数遇语法错误求助(PL/pgSQL)
问题诊断与修复
你的代码出现语法错误的核心原因是PL/pgSQL的IF分支结构不匹配:
你使用了else if来实现多分支,但这种写法在PL/pgSQL中会开启一个新的嵌套IF块,需要额外的END IF来闭合。而你的代码里只写了一个END IF,导致语法解析失败。
修正后的代码
drop function if exists handle_new_user(); create function handle_new_user() returns trigger language plpgsql security definer set search_path = public as $$ begin if new.raw_user_meta_data::json->>'type' = 'practice' then insert into profiles (user_id, email, username, type, practice_id) values ( new.id, new.email, new.raw_user_meta_data::json->>'username', new.raw_user_meta_data::json->>'type', new.id ); ELSIF new.raw_user_meta_data::json->>'type' = 'salesRep' then insert into profiles (user_id, email, username, type, rep_id) values ( new.id, new.email, new.raw_user_meta_data::json->>'username', new.raw_user_meta_data::json->>'type', new.id ); end if; return new; end; $$; create trigger on_auth_user_created after insert on auth.users for each row execute procedure handle_new_user();
关键修改点
- 将
else if替换为PL/pgSQL标准的多分支关键字ELSIF(单关键字写法),这样整个IF结构只需要一个END IF即可正确闭合,解决语法错误。 - 其余业务逻辑和触发器定义无需修改。
内容的提问来源于stack exchange,提问作者Luke Longo
相关产品推荐
相关产品推荐

