我有一个 PostgreSQL 触发器,它在
INSERT
表上的 auth.users
之后触发,调用函数 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');
任何有关如何解决此错误的见解或建议将不胜感激。谢谢!
该功能可能不在您的
search_path
上。您应该始终为每个函数设置适当的 search_path
,以便您在函数中调用的所有表和函数都位于其中一个架构中。例如
ALTER FUNCTION handle_new_user SET search_path = auth, public;
如果
insert_into_profiles()
位于模式 auth
或模式 public
中,则该方法有效。
确保您的功能设置为
security definer
CREATE OR REPLACE FUNCTION insert_into_profiles(
inp_profile_id UUID,
inp_first_name TEXT,
inp_last_name TEXT
)
RETURNS VOID
security definer
AS $$
BEGIN
INSERT INTO profiles (profile_id, first_name, last_name)
VALUES (inp_profile_id, inp_first_name, inp_last_name);
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION handle_new_user()
RETURNS TRIGGER
security definer
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;