GRANT EXECUTE 不授予对函数中相关表的访问权限

GRANT EXECUTE not granting access to related tables in function

我有一个用户应该只能访问 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$

所以,没有授予对相关表的访问权限?如何仅为函数执行授予访问权限?

您想使用 SECURITY DEFINER 定义函数(请参阅 documentation)。

默认情况下,Postgres 使用调用者的权限,而不是定义者的权限。

CREATE OR REPLACE FUNCTION public.some_func(firstid integer)
 RETURNS TABLE(/* something */)
 LANGUAGE plpgsql
 SECURITY DEFINER
 . . .