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

问题描述 投票:0回答:2

我有一个 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');
,但是在触发上下文中,似乎找不到函数签名。

任何有关如何解决此错误的见解或建议将不胜感激。谢谢!

sql database postgresql triggers supabase
2个回答
0
投票

该功能可能不在您的

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

ALTER FUNCTION handle_new_user SET search_path = auth, public;

如果

insert_into_profiles()
位于模式
auth
或模式
public
中,则该方法有效。


0
投票

确保您的功能设置为

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;
© www.soinside.com 2019 - 2024. All rights reserved.