Предоставить пользователю доступ к подмножеству таблицы в PostgreSQL - PullRequest
3 голосов
/ 14 мая 2011

Я знаю, что могу использовать представления для предоставления доступа к подмножеству атрибутов в таблице.Но как я могу предоставить доступ только к определенным кортежам?Скажем, у меня есть таблица зарегистрированных учеников, атрибут имени пользователя, а затем еще что-то вроде степени_стата, как мне предоставить доступ, чтобы пользователь А мог выбрать из таблицы только кортеж, соответствующий имени пользователя А?У меня есть экзамен по базе данных, и я изучаю некоторые прошлые работы, и я столкнулся с этим вопросом, но я не знаю, как ответить на него, и я не могу найти, как сделать это из моей книги "Система Dtabase: практический подход к проектированию баз данных, Внедрение и управление '

Спасибо, любая помощь очень ценится!

Мэтт

Ответы [ 4 ]

3 голосов
/ 15 мая 2011

Скажите, что вы получили:

Table items (item_id, ...)
Table users (user_id, ...)
Table users_permissions( user_id, item_id, perm_type )

Вы можете создать ВИД как:

SELECT i.*, p.perm_type 
FROM items JOIN users_permissions USING (item_id) 
WHERE user_id = get_current_user_id();

Пользователи могут выбирать из этого представления, но не удалять WHERE и JOIN, ограничивающие разрешения.

Вероятно, основной проблемой будет функция get_current_user_id ();)

2 голосов
/ 15 мая 2011

Вдоль строк ответа peufeu, в Postgresql текущее имя пользователя доступно через функцию current_user. Итак, вид

CREATE VIEW available_bigtable AS
SELECT * FROM bigtable
WHERE username = current_user;

похоже, что он делает то, что вам нужно. Предоставьте SELECT всем в представлении, но никому (кроме администраторов) в базовом bigtable.

1 голос
/ 15 мая 2011

Проект Veil предоставляет основу для управления доступом на уровне строк в PostgreSQL.

0 голосов
/ 25 ноября 2012

Как насчет создания функции, которая берет идентификатор пользователя и возвращает подмножество строк, к которым он имеет доступ?

CREATE FUNCTION user_items(integer) RETURNS SETOF items AS $$
    SELECT * FROM items WHERE user_id = $1
$$ LANGUAGE SQL;

SELECT * FROM user_items(55); # 55 being the user id

edit Если подумать об этом больше, это может привести кснижение производительности, так как условие user_id будет применено ко всему набору данных до любых других условий «пользователь-земля».

Например, SELECT * FROM user_items(55) WHERE id=45 сначала отфильтрует всю таблицу для пользовательских элементов, итолько затем найти идентификатор для этого подмножества.

С помощью представлений планировщик запросов может принять решение об оптимальном порядке оценки условий (где он, вероятно, сначала отфильтрует по идентификатору, чем по идентификатору пользователя).При использовании функции, как я предложил, postgres не может этого сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...