2015-12-09 10 views
0

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

У меня есть стол. Таблица ранг (ID INT, ранг INT, год INT, пол символ (1), количество 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.

, например,

пользователь а (может видеть все) означает 'выбрать * из ранга;'

результат: 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,

пользователь б (не безопасно) означает 'выбрать * из ранга;'

результат: 2,1, 2012, 1,1, source_system_b, 4,3, 2012, 1,1, source_system_c,

Большое спасибо

+0

* «Im с использованием базы данных Greenploum, но им при условии его более или менее такой же, как Postgres» *. Это не так. Он основан на очень старой версии PostgreSQL, которая была сильно изменена. –

ответ

1

Greenplum не Row Level Security (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; 
+0

Да, это похоже на лучший подход до тех пор, пока не будет принят какой-либо RLS. не хотел, чтобы спуститься с точки зрения подхода. Спасибо за это! –

 Смежные вопросы

  • Нет связанных вопросов^_^