Политика выбора уровня строки в Postgres (greenplum)

Я использую базу данных Greenploum, но предполагаю, что она более или менее такая же, как Postgres. Я хочу реализовать политику безопасности на уровне строк на основе значения столбца, по которому разбита таблица.

У меня есть стол. ТАБЛИЦА ранг (id int, rank int, year int, пол 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,

Огромное спасибо


person Nazilla    schedule 09.12.2015    source источник
comment
Я использую базу данных Greenploum, но предполагаю, что она более или менее такая же, как Postgres. Это не так. Он основан на очень старой версии PostgreSQL, которая была значительно изменена.   -  person Craig Ringer    schedule 10.12.2015


Ответы (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;
person Jon Roberts    schedule 09.12.2015
comment
Да, это похоже на лучший подход, пока не будет принят какой-то RLS. не хотел спускаться по подходу просмотра. Спасибо за это! - person Nazilla; 10.12.2015