sch text;
BEGIN
FOR sch IN SELECT nspname FROM pg_namespace
LOOP
EXECUTE format($$ GRANT usage, create ON SCHEMA %I TO role_rw$$, sch);
execute format($$ GRANT all PRIVILEGES ON ALL TABLES IN SCHEMA %I to role_rw$$, sch);
execute format($$ ALTER DEFAULT PRIVILEGES in schema %I GRANT all PRIVILEGES ON TABLES TO role_rw$$, sch);
execute format($$ grant all PRIVILEGES on all functions in schema %I to role_rw$$,sch);
execute format($$ grant all PRIVILEGES on all SEQUENCES in schema %I to role_rw$$,sch);
END LOOP;
END;
$do$;
Создал 2-ух пользователей и добавил в эту роль.
Ситуация:
1-ый пользователь создает таблицу, а 2-ой пользователь не имеет доступа к этой таблице.
Разве наследие берется не от роли ?
версия PG 10.17
ALTER DEFAULT PRIVILEGES работает для роли которая его выполнила, если явно не указано FOR ROLE , Следовательно данная конструкция будет работать только в случае если таблицу создаёт указанная роль, в вашем случае тот кто выполнил данный запрос.
оно навешивается на схемы, в схеме я вижу, для роли права по умолчанию.
И да, и нет. Посмотрите как оно выглядит в дампе базы pg_dump database_name -s > 1.sql Там будет явно указана роль, и это будет та роль под который вы выполнили данный запрос.
Скажем так, событие которое триггерит данный грант, это не просто создание объекта в схеме, а создание объекта в схеме определённым пользователем.
то есть по сути, запрос должен быть вот таким ? ALTER DEFAULT PRIVILEGES for role role_rw in schema public GRANT all PRIVILEGES ON tables to role_rw
Да, всё верно. Но я не знаю насколько это корректно работает для роли, а не юзера, не проверял. Если работает успешно, просьба поделиться потом тут)
Данная команда выглядит бессмысленно: даёте гранты на объекты, созданные из под роли role_rw для этой же роли, а эта роль в свою очередь и так имеет все права, если выступает в качестве владельца объекта. Мб вот это поможет: https://pcnews.ru/blogs/sahar_dla_slonenka____bystryj_start_c_postgresql_dla_komand_v_nlmk-1230872.html#gsc.tab=0 Суть в том, что у всех объектов схеме должен быть один владелец (техническая роль), для этой роли настраиваем default privileges на гранты для тех ролей, которые реально должны читать, писать и управлять объектами. Главное, чтобы при создании новых объектов - они создавались из под этой технической роли, так как если делать просто через смену владельца, дефолты не накатываются.
спасибо, думаю проще перебрать на 14 версию и выше, и манипулировать встроенными ролями просто (read_data / write_data)
Обсуждают сегодня