Предоставить выбор по представлениям, которые используют функции - PullRequest
2 голосов
/ 03 июля 2011

Я использую postgresql 8.4, и у меня возникла небольшая проблема с предоставлением привилегий выбора для представления из базы данных, добавленной другим пользователем, когда представление использует какую-либо из функций базы данных.

Как новый пользователь, когда я пытаюсь запустить, например, , выберите * из users_pwd; , где users_pwd определен как:

create view users_pwd as
select *, get_pwd(id)
from users;

и get_pwd как:

CREATE OR REPLACE FUNCTION get_pwd(p_id integer)
RETURNS text AS
$BODY$
declare u record;
BEGIN
select into u * from users where id = p_id;
return u.password;
END;
$BODY$
LANGUAGE plpgsql;

Я получаю следующую ошибку:

ERROR:  permission denied for relation users
CONTEXT:  SQL statement "select * from users where id =  $1 "
PL/pgSQL function "get_pwd" line 3 at SQL statement

Единственный способ получить пользовательский запрос к представлению - это явно предоставить выборку в таблице users , которую яне хочу делать.

Если представление не использует какую-либо функцию, а просто другие таблицы, к которым у нового пользователя нет явного доступа, оно прекрасно работает.

1 Ответ

4 голосов
/ 03 июля 2011

Вы можете создать функцию с владельцем, который может выбирать из таблицы пользователей.Такая функция должна быть создана с предложением SECURITY DEFINER, поэтому она будет выполняться с правами владельца.

Более подробную информацию вы можете найти здесь: http://www.postgresql.org/docs/9.0/interactive/sql-createfunction.html

Вы также можете предоставить права GRANT EXECUTE вфункции.См. GRANT в документации.

...