我在 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/