Postgres предоставляет CRUD в базе данных для пользователя

У меня есть приложение, которое использует базу данных postgres. У меня есть пользователь суперадминистратор. Теперь мне нужны еще два пользователя: один «пользователь приложения» с CRUD-привилегиями и один с привилегиями ALTER и CREATE (для применения миграций). Это все пользователи, которые мне нужны, потому что приложение имеет свое управление User-Access и менять его совсем не планируется.

Я хочу что-то вроде: GRANT SELECT, INSERT, UPDATE, DELETE ON DATABASE MyDatabase TO myuser

Я прочитал здесь, что postgres предоставляет предопределенные роли. Это хорошо, но эти роли применяются глобально (как указано в одном комментарии). MyDatabase находится в схеме public, что становится проблематичным, потому что некоторые системные таблицы также общедоступны, и я не хочу, чтобы мой пользователь мог читать или писать в них.

Я был бы в порядке с GRANT pg_read_all_data, pg_write_all_data ON DATABASE MyDatabase TO myuser, но это не работает.

Поскольку я не буду часто менять эти привилегии, меня бы даже устроило GRANT pg_read_all_data ON MyDatabase.MyTable TO myuser. Но и это не работает.

Любые идеи по этому поводу?

pg_read_all_data определенно не "применяется к схеме" - это глобальная роль. Пользователь с этой ролью может читать данные из любой таблицы. У меня также сложилось впечатление, что вы путаете термины «база данных» и «схема».
a_horse_with_no_name 08.12.2022 19:29

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

Joshit 08.12.2022 20:50
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В PostgreSQL нет привилегий ALTER и CREATE. Пользователь базы данных, который должен иметь возможность запускать операторы ALTER и CREATE, должен быть владельцем объектов базы данных. Если у вас уже есть объекты, принадлежащие другому пользователю, вам придется изменить владельца.

Для другого пользователя вам придется предоставить привилегии для каждого объекта. Привилегии на БД не помогут — между объектами нет наследования привилегий. Не забудьте предоставить USAGE на схемах.

Я рекомендую вам создавать больше схем, чем public. Если у вас есть отдельная схема для объектов вашего приложения, вы можете использовать такие операторы, как

GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA myapp TO someuser;

Другие вопросы по теме