这是一个简单的测试:
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函数背后的实际表?如果是 - 怎么样?