2011-05-14 1 views
3

Я знаю, что я могу использовать представления для предоставления доступа к подмножеству атрибутов в таблице. Но как я могу предоставить доступ только к определенным кортежам? Скажем, у меня есть таблица зарегистрированных студентов, атрибут имени пользователя, а затем какой-то другой, такой как degree_status, как я могу предоставить доступ, чтобы пользователь A мог только выбрать из таблицы кортеж, соответствующий имени пользователя A? У меня есть экзамен базы данных, и я изучаю некоторые прошлые документы, и я столкнулся с этим вопросом, но я не знаю, как ответить на него, и я не могу найти, как это сделать из моей книги «Система Dtabase: практический подход к проектированию баз данных , внедрение и управление»Предоставить доступ к подмножеству таблицы пользователю PostgreSQL

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

Matt

+0

Я занимаюсь некоторыми исследованиями, которые я собираюсь сделать, и наткнулся на http://archives.postgresql.org/pgsql-hackers/2009-10/msg01346.php; 'tis довольно интересный момент, чтобы добавить к ответам ниже ... – alex

ответ

3

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

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

вы можете создать VIEW вроде этого:

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() функция, вероятно, будет серьезной проблемой;)

+1

Должно быть легко, если каждый «настоящий» пользователь использует другую учетную запись Postgres, тогда 'get_current_user_id()' просто 'current_user' –

+0

Да. <каждый «настоящий» пользователь использует другую учетную запись Postgres> является PITA, но, с другой стороны, это единственный способ иметь права доступа к базе данных. Наличие zillion пользователей БД - главная проблема. Если у вас 10 пользователей, пойдите для этого. – peufeu

+0

Спасибо, это именно то, что мне нужно.Я не знал об этой функции, очень полезен :) – matthewbpt

2

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

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

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

+0

Очень полезно спасибо за помощь, эта функция current_user - именно то, что мне нужно :) – matthewbpt

+1

Кнопка «Принять» должна быть где-то там. :) –

1

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

0

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

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 

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

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

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