0

我使用的是 Greenploum 数据库,但我假设它或多或少与 Postgres 相同。我想根据表分区的列的值来实现行级安全策略。

我有一张桌子。TABLE rank(id int、rank int、year int、gender char(1)、count int、source_system 文本)

示例数据: (1,2, 2012, 1,1, source_system_a), (2,1, 2012, 1,1, source_system_b), (3,4, 2012, 1,1, source_system_a), (4,3, 2012, 1,1, source_system_c),

该表基于 source_system 列进行分区。我希望有一组可以看到所有数据的用户和一组不能看到基于 source_system 列的所有内容的用户。source_system_a 应该是一个安全值,因此只有具有安全权限的人才能看到具有 source_system_a 的行。

例如,

用户 a(可以查看全部)执行“从排名中选择 *;”

结果: 1,2, 2012, 1,1, source_system_a, 2,1, 2012, 1,1, source_system_b, 3,4, 2012, 1,1, source_system_a, 4,3, 2012, 1,1, source_system_c,

用户 b(不安全)确实“从排名中选择 *;”

结果: 2,1, 2012, 1,1, source_system_b, 4,3, 2012, 1,1, source_system_c,

非常感谢

4

1 回答 1

1

除了为不同的用户组创建视图之外,Greenplum 没有行级安全性 (RLS)。如果您使用视图动态隐藏行,则有一种方法可以查看隐藏的行,因此不要这样做。

PostgreSQL 在引入 security_barrier 特性之前也有同样的视图问题,但 Greenplum 还没有这个特性。

因此,对于您的示例,我将创建两个视图:

CREATE TABLE rank (id int, rank int, year int, gender char(1), count int, source_system text) DISTRIBUTED BY (id);
CREATE USER user_a;
CREATE USER user_b;

CREATE VIEW vw_rank_a AS SELECT * FROM rank;
CREATE VIEW vw_rank_b AS SELECT * FROM rank WHERE source_system <> 'source_system_a';

GRANT SELECT ON vw_rank_a TO user_a;
GRANT SELECT ON vw_rank_b TO user_b;
于 2015-12-09T18:18:56.420 回答