Транзитивные / вложенные разрешения в PostgreSQL - PullRequest
1 голос
/ 25 сентября 2019

У меня есть следующие настройки:

create role test_user noinherit nologin;

create table test_me ( attr text );
create view v_test_me as select * from test_me;

create function fn() returns trigger language plpgsql as $$
begin
    insert into test_me(attr) values (NEW.attr);
    return NEW;
end; $$;
create trigger tg instead of insert on v_test_me 
for each row execute procedure fn();

grant insert on v_test_me to test_user;

set role test_user;
insert into v_test_me(attr) values ('hello?');

Здесь у меня есть таблица и вид сверху.Представление имеет вместо триггера.Я разрешаю test_user вставить в представление.Но я получаю следующую ошибку:

ERROR:  permission denied for table test_me
CONTEXT:  SQL statement "insert into test_me(attr) values (NEW.attr)"

Похоже, у меня нет разрешения на выполнение оператора insert в таблице test_me, что ожидается.Можно ли как-то разрешить пользователю вставлять в таблицу test_me, не предоставляя им такого разрешения напрямую?

1 Ответ

2 голосов
/ 25 сентября 2019

В этом случае модификатор SECURITY DEFINER в функции триггера fn() решит проблему.Согласно документации CREATE FUNCTION :

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

Это позволит вставить в таблицу test_me, если у владельца функции есть такое разрешение.

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