2016-09-21 58 views
1

我在postgresql(版本9.3)中遇到了问题。Postgres GRANT不适用于家长

我试图限制角色'client_1'。我希望它能够只为一个表格进行选择。但是表之间有继承关系。

这里是我的表结构:

CREATE TABLE public.table_a (...); 
CREATE TABLE table_a_partitions.child_1 (...) INHERITS (public.table_a); 
CREATE TABLE table_a_partitions.child_2 (...) INHERITS (public.table_a); 

GRANT SELECT ON table_a_child_1 TO client_1; 

没事的时候我做了选择上child_2,有错误,但如果我的例子做了SELECT * FROM table_a;它也读出禁止表child_2。当我做客SELECT * FROM table_a;时,我的客户只会访问child_1(以及其他未来的)结果。

有没有简单的方法来解决这个问题?

谢谢

回答

0

您需要在PostgreSQL 9.3中使用VIEW来解决这个问题。但是,如果您升级到9.5,则可以使用行级安全性。

作为关于为什么,授权检查只发生在查询的初始关系的级别上。这意味着如果您查询视图,您需要访问视图的内容,但视图所有者(不是您)需要访问基础关系。这允许视图对信息隐藏有用。与继承类似,此结构允许您禁止直接从表的分区插入或查询行,但允许通过父表执行不同的查询。所以这是设计优先级的结果,而不是错误。

在行级安全性之前,您基本上会创建一个视图并将用户特权条件折叠到视图中(使用分区/继承,由于其他原因,插入/更新/删除触发器可能会完全返回即使它不能在桌面上,数据库也会做什么)。对于行级别的安全性,PostgreSQL 9.5确实允许你指定行级别的策略(附加到插入/选择/更新/删除查询的条件),并且在某些情况下提供了一些比视图方法。