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(),而不允许普通SELECT、UPDATE和查询DELETE?INSERTt
我尝试了以下方法:
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)