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