Postgres (greenplum) 上的行级别 select 政策
Row level select policy on Postgres (greenplum)
我使用的是 Greenploum 数据库,但我假设它或多或少与 Postgres 相同。我想根据 table 分区依据的列的值实施行级安全策略。
我有一个table。 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),
table 是根据 source_system 列进行分区的。我想要一组可以看到所有数据的用户和一组不能看到基于 source_system 列的所有数据的用户。 source_system_a 应该是一个安全值,因此只有那些具有安全权限的人才能看到带有 source_system_a 的行。
例如,
用户 a(可以看到所有)'select * from rank;'
结果:
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(不安全)'select * from rank;'
结果:
2,1, 2012, 1,1, source_system_b,
4,3, 2012, 1,1, source_system_c,
非常感谢
除了为不同的用户组创建视图外,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;
我使用的是 Greenploum 数据库,但我假设它或多或少与 Postgres 相同。我想根据 table 分区依据的列的值实施行级安全策略。
我有一个table。 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),
table 是根据 source_system 列进行分区的。我想要一组可以看到所有数据的用户和一组不能看到基于 source_system 列的所有数据的用户。 source_system_a 应该是一个安全值,因此只有那些具有安全权限的人才能看到带有 source_system_a 的行。
例如,
用户 a(可以看到所有)'select * from rank;'
结果:
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(不安全)'select * from rank;'
结果:
2,1, 2012, 1,1, source_system_b,
4,3, 2012, 1,1, source_system_c,
非常感谢
除了为不同的用户组创建视图外,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;