PostgreSQL - 隐藏数据库结构但允许查询某些角色的选定视图(用户)

时间:2016-03-24 22:52:15

标签: postgresql permissions

我在PostgreSQL 9.4中拥有一个拥有绝密结构的大型数据库。 有很多数据在不断变化。 我想让我的一个客户访问此数据库中的某些视图。

我不会让客户看到这个数据库的结构 - 他应该只能获得对所选视图/表进行一些只读查询的访问权。

如果我对所选视图提供只读访问权限,我希望客户使用此视图中的数据进行任何SELECT查询(由客户决定),即:

SELECT * FROM view_1;
SELECT MIN(col_a), MAX(col_b) FROM view_1;

可以在PostgreSQL中这样做吗?

如果不是......最好的解决方法是什么?

客户需要通过标准PostgreSQL连接访问并制作标准SQL SELECT(不接受DB的中间件/ api)。由于空间有限,无法进行表复制。也许我可以为客户创建一些数据库,从某些方面从我的数据库中获取数据?但在这种情况下,我担心客户可能会在我的数据库中看到用户和密码。

1 个答案:

答案 0 :(得分:1)

您需要做的就是将视图放在一个单独的模式中,并将该模式​​(以及该模式)的USAGE授予用户:

CREATE SCHEMA tables;
CREATE TABLE tables.some_table(i int);
INSERT INTO tables.some_table SELECT generate_series(1,9);
CREATE ROLE test;  
CREATE SCHEMA views;
GRANT USAGE ON SCHEMA views TO test;
CREATE VIEW views.some_view AS SELECT * FROM tables.some_table;
GRANT SELECT ON views.some_view TO test;
SET ROLE test;
SELECT count(*) FROM views.some_view;
 count 
-------
     9
(1 row)

尝试从表格中选择会给您一个错误:

SELECT count(*) FROM tables.some_table; 
ERROR:  permission denied for schema tables
LINE 1: SELECT count(*) FROM tables.some_table;