Postgres上的行级选择策略(greenplum)

时间:2015-12-09 15:17:40

标签: sql postgresql permissions greenplum row-level-security

我正在使用Greenploum数据库,但我假设它与Postgres大致相同。我想基于表所分区的列的值来实现行级安全策略。

我有一张桌子。 TABLE rank(id int,rank int,year int,gender char(1),count int,source_system text)

示例数据: (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,

非常感谢

1 个答案:

答案 0 :(得分: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;