我正在使用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,
非常感谢
答案 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;