Postgres GRANT未应用于父

时间:2016-09-21 13:27:13

标签: postgresql inheritance partitioning grant

我在postgresql(版本9.3)中遇到了麻烦。

我试图限制ROLE' 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(以及将来的其他一些人)。

有没有一种简单的方法可以解决这个问题?

谢谢

1 个答案:

答案 0 :(得分:0)

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

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

在行级安全性之前,您基本上会创建一个视图并将用户权限标准折叠到视图中(使用分区/继承这也是一个好主意,因为您的插入/更新/删除触发器可以准确返回即使它不能在桌面上,数据库也会这样做。)

对于行级安全性,PostgreSQL 9.5允许您指定行级策略(附加到insert / select / update / delete查询的条件),并且在某些情况下提供比视图更易于管理的内容方法