Выдача привелегий для функций

Добрый день.

Имеется несколько таблиц, доступ к которым не выдан ни одной группе. Для доступа к таблицам на просмотр (select) выданы гранты на соответствующие представления (view). Наполнение таблиц реализовано через вызовы соответствующих функций, доступ к которым (execute) выдан соответствующим группам.
При вызове функции возникает ошибка, что мол доступ запрещён и выводит кусок текста, где выполняется вставка в таблицу.

Можно ли как то выдать права для функции на вставку/изменение/удаление в таблицу? Либо всегда для всех пользователей нужно выдавать ВСЕ права, чтобы всё корректно заработало (как то это кривовато, зачем тогда вообще привилегии)?
Например имеется таблица "log", в которую пишутся все изменения в основной (рабочей) таблице. Вставка в таблицу "log" реализована через триггер. Доступ к таблице "log" на просмотр открыт только администратору (группа group0), всем остальным доступ к протоколу изменений должен быть закрыт как на просмотр, так и на редактирование. Каким образом тогда реализовать наполнение таблицы "log" для пользователей, у которых нет прав на SELECT/INSERT/UPDATE/DELETE для таблицы "log"?

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Воспользуйтесь поиском по

Воспользуйтесь поиском по данному сайту по ключевым словам "Права на функции"
Насколько я помню этот вопрос уже рассматривался.

Вы правы, действительно есть

Вы правы, действительно есть как минимум 3 обсуждения на эту тему:
http://postgresql.ru.net/node/156594
http://postgresql.ru.net/node/106095
http://postgresql.ru.net/node/48998

Попробовал, действительно работает... НО, судя по всему функция с указанием SECURITY DEFINER, работает в контексте пользователя создавшего функцию, а не с привилегиями "создателя". Другими словами CURRENT_USER вернёт не имя текущего пользователя, а имя пользователя создавшего функцию. В большинстве случаев этого наверное достаточно, но как протоколировать изменения, если из функции не доступно имя текущего пользователя?
Может и на этот случай есть "ключик"?

Вообще-то логично, что если

Вообще-то логично, что если функция выполняется от имени (с правами) какого-то пользователя, то соответственно таковое и текущее имя пользователя. Не влазя глубоко в тему, первое что приходит на ум - это получать CURRENT_USER до вызова означеной функции и передавать это имя в функцию как один из параметров.

Это решение конечно же

Это решение конечно же приходило мне в голову, однако речь идёт о триггере (триггерной функции) и как из триггера в функцию передать параметр (не константу) право не знаю.

Прошу прощения, что в первом посте не привёл версии использованного ПО:
- ОС Linux (Fedora 8 );
- PostgreSQL 8.2.11;

С базой PostgreSQL близко познакомился неделю назад, до этого только слышал и читал сравнительные тесты с другими базами. Отсюда и наверное вполне очевидные вопросы...

В данном случае нужно

В данном случае нужно использовать SESSION_USER. Выдержка из документации:
The session_user is normally the user who initiated the current database connection; but superusers can change this setting with SET SESSION AUTHORIZATION. The current_user is the user identifier that is applicable for permission checking. Normally, it is equal to the session user, but it can be changed with SET ROLE. It also changes during the execution of functions with the attribute SECURITY DEFINER. In Unix parlance, the session user is the "real user" and the current user is the "effective user".

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023