授予执行存储的函数而不授予在函数内部使用对象的权限

时间:2016-08-22 11:04:20

标签: postgresql postgresql-9.5

这是一个简单的测试:

nd@postgres=# create table t(i serial primary key, x text);
nd@postgres=# create function t_get(p_x in text = null) returns setof t language sql as $$ select * from t where i % 2 = 0 and p_x is null or x ilike p_x $$;
nd@postgres=# insert into t(x) select generate_series(1,10,2);
nd@postgres=# select * from t_get();
╔═══╤═══╗
║ i │ x ║
╠═══╪═══╣
║ 2 │ 3 ║
║ 4 │ 7 ║
╚═══╧═══╝

到目前为止一直很好。

但是,我的目标是向普通用户授予对函数的访问权限,而无需访问所使用的表:

nd@postgres=# create role testrole with login password '111';
nd@postgres=# grant execute on function t_get(text) to testrole;
nd@postgres=# set role testrole;
nd@postgres=> select * from t_get();
ERROR:  permission denied for relation t
CONTEXT:  SQL function "t_get" statement 1

据我所知,PostgreSQL定位为OOP数据库,封装是OOP的三条鲸之一。

所以我的问题是:是否可以隐藏PostgreSQL中getter / setter函数背后的实际表?如果是 - 怎么样?

0 个答案:

没有答案