我的用户只能访问2个函数,所以我将它们授予了他:
REVOKE ALL ON FUNCTION some_func(firstid INT) FROM PUBLIC;
GRANT EXECUTE ON FUNCTION some_func(firstid INT) TO some_user;
但我得到了奇怪的错误:
42501: permission denied for relation some_table
尝试访问我的函数时使用:
SELECT * FROM offers_get(0);
我的功能如下:
CREATE OR REPLACE FUNCTION public.some_func(firstid integer)
RETURNS TABLE(/* something */)
LANGUAGE plpgsql
AS $function$
DECLARE
/* something */
BEGIN
/* some other logic */
RETURN QUERY SELECT * FROM some_table;
END;
$function$
那么,是否未授予对相关表的访问权限?如何仅为函数执行授予访问权限?
答案 0 :(得分:1)
您想使用SECURITY DEFINER
定义该功能(请参阅documentation)。
默认情况下,Postgres使用调用者的权限,而不是定义者。
CREATE OR REPLACE FUNCTION public.some_func(firstid integer)
RETURNS TABLE(/* something */)
LANGUAGE plpgsql
SECURITY DEFINER
. . .