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

时间:2015-10-11 18:57:27

标签: postgresql postgresql-9.4

我的用户只能访问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$

那么,是否未授予对相关表的访问权限?如何仅为函数执行授予访问权限?

1 个答案:

答案 0 :(得分:1)

您想使用SECURITY DEFINER定义该功能(请参阅documentation)。

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

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