我在使用 Supabase 触发器和函数执行权限时遇到问题。我设置了一个触发器,在插入
auth.users
表后触发。触发器调用名为 public.handle_new_user()
的函数,该函数执行某些操作,包括将数据插入另一个表 public.profiles
。
这是我所做的总结:
DROP TRIGGER IF EXISTS on_auth_user_created ON auth.users;
CREATE OR REPLACE FUNCTION public.handle_new_user()
RETURNS TRIGGER AS $$
BEGIN
RAISE LOG 'Current user: %', current_user;
PERFORM public.insert_into_profiles(
NEW.id,
(NEW.raw_user_meta_data->>'first_name'),
(NEW.raw_user_meta_data->>'last_name')
);
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER on_auth_user_created
AFTER INSERT ON auth.users
FOR EACH ROW
EXECUTE FUNCTION public.handle_new_user();
当我在 Supabase 仪表板中执行
insert_into_profiles()
时,它可以正常工作,因为它是作为 postgres
用户执行的。但是,当在 handle_new_user()
函数中以及由 INSERT
之后的触发器(由 supabase_auth_admin 触发)调用此函数时,我会遇到专门针对 public.profiles
表的“权限被拒绝”错误。
关于为什么触发器调用的函数没有所需权限的任何见解,特别是当函数本身在独立执行时工作时?
感谢您的帮助或指导!
我已经验证了
public.insert_into_profiles
函数在直接执行时可以正常工作:
SELECT public.insert_into_profiles(
'b53e07f1-e775-4a15-b287-8a25d3525bca',
'John',
'Doe'
);
此命令执行没有问题。然而,在
handle_new_user()
上下文中,它似乎缺乏必要的权限。
我还删除了所有行级别安全性 (RLS) 策略,但错误仍然存在
您必须使您的函数成为安全定义器,以便它具有 Postgres 权限。
CREATE OR REPLACE FUNCTION public.handle_new_user()
RETURNS TRIGGER
security definer
AS $$
BEGIN
RAISE LOG 'Current user: %', current_user;
PERFORM public.insert_into_profiles(
NEW.id,
(NEW.raw_user_meta_data->>'first_name'),
(NEW.raw_user_meta_data->>'last_name')
);
RETURN NEW;
END;
$$ LANGUAGE plpgsql;