我有一个PostgreSQL触发器,它在auth.users
表上的INSERT
之后触发,调用一个函数handle_new_user()
,然后调用insert_into_profiles()
将用户数据添加到另一个表。insert_into_profiles
函数定义如下:
CREATE OR REPLACE FUNCTION insert_into_profiles(
inp_profile_id UUID,
inp_first_name TEXT,
inp_last_name TEXT
)
RETURNS VOID AS $$
BEGIN
INSERT INTO profiles (profile_id, first_name, last_name)
VALUES (inp_profile_id, inp_first_name, inp_last_name);
END;
$$ LANGUAGE plpgsql;
字符串
触发函数handle_new_user()
为:
CREATE OR REPLACE FUNCTION handle_new_user()
RETURNS TRIGGER AS $$
BEGIN
PERFORM 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 handle_new_user();
型
然而,当触发器触发时,我遇到一个错误:
函数insert_into_profiles(uuid,text,text)不存在。
是什么导致了这个问题?
该函数在手动调用时工作正常,例如SELECT insert_into_profiles('12345678-1234-5678-1234-1234567890123,'Jhon','Doe');
,但在触发器上下文中,它似乎无法找到函数签名。
任何关于如何解决此错误的见解或建议将不胜感激。谢谢!
2条答案
按热度按时间a1o7rhls1#
确保您的函数设置为
security definer
个字符
zkure5ic2#
该函数可能不在您的
search_path
上。您应该始终在每个函数上设置适当的search_path
,以便在该函数中调用的所有表和函数都在其中一个架构中。例如字符串
如果
insert_into_profiles()
在模式auth
或模式public
中,则这将起作用。