PostgreSQL触发函数调用错误:“函数< function>不存在”

zour9fqk  于 5个月前  发布在  PostgreSQL
关注(0)|答案(2)|浏览(152)

我有一个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');,但在触发器上下文中,它似乎无法找到函数签名。
任何关于如何解决此错误的见解或建议将不胜感激。谢谢!

a1o7rhls

a1o7rhls1#

确保您的函数设置为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;

个字符

zkure5ic

zkure5ic2#

该函数可能不在您的search_path上。您应该始终在每个函数上设置适当的search_path,以便在该函数中调用的所有表和函数都在其中一个架构中。例如

ALTER FUNCTION handle_new_user SET search_path = auth, public;

字符串
如果insert_into_profiles()在模式auth或模式public中,则这将起作用。

相关问题