postgresql - Postgres GRANT 未应用于父级

标签 postgresql inheritance partitioning sql-grant

我在 postgresql(9.3 版)中遇到了 grant 的问题。

我正在尝试限制角色“client_1”。我希望它只能选择一张 table 。但是表之间是有继承关系的。

这是我的表结构:

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(以及将来的其他一些)结果。

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

谢谢

最佳答案

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

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

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

至于行级安全性,PostgreSQL 9.5 确实允许您指定行级策略(附加到插入/选择/更新/删除查询的条件)并且在某些情况下提供比 View 更易于管理的东西方法。

关于postgresql - Postgres GRANT 未应用于父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39617943/

相关文章:

postgresql - 让 Postgres 在必要时截断值?

postgresql - 无法从 docker-compose 启动 postgres docker 容器

java - 在 Java 中使用默认构造函数扩展类

algorithm - 如何加速具有许多重复元素的 Quickselect?

ruby-on-rails - PostgreSQL Ruby Heroku 问题

c# - C#中的多重继承

Python 支持有限形式的多重继承。以什么方式限制?

python - 将数字列表拆分为 n 个 block ,使这些 block 具有(接近)相等的总和并保持原始顺序

oracle - oracle如何管理一个hash分区

performance - Oracle 和 PostgreSQL 的性能差异有多大?