只允许通过函数访问表,而不是直接通过查询访问表

Kat*_*rin 4 postgresql permissions role acl

我有一个表t和一些可以访问的函数t。例如:

create function list_t() returns setof t as $$
    select * from t;
$$ language sql stable;
Run Code Online (Sandbox Code Playgroud)

是否可以将角色权限定义为仅允许执行list_t(),而不允许普通SELECTUPDATE和查询DELETEINSERTt

我尝试了以下方法:

grant execute on all functions in schema public to my_user;
revoke all on t from my_user;
Run Code Online (Sandbox Code Playgroud)

虽然这确实不允许SELECT * FROM t,但也不允许SELECT list_t()

小智 6

您需要以对基础表具有(选择)访问权限的用户身份创建该函数。然后使用选项定义函数,这意味着当调用该函数时,它以函数所有者security defined的权限进行操作,而不是调用者:

create function list_t() returns setof t 
  security definer
as $$
    select * from t;
$$ language sql stable;
Run Code Online (Sandbox Code Playgroud)

另一种方法是创建一个视图,然后向该视图(而不是表)授予 SELECT 权限:

create view v_t
as
select *
from t;

grant select on v_t to my_user;
Run Code Online (Sandbox Code Playgroud)

FROM请注意,子句中应像表一样使用集合返回函数:

select *
from list_t();
Run Code Online (Sandbox Code Playgroud)