У меня есть приложение, которое использует базу данных 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. Но и это не работает.
Любые идеи по этому поводу?
Спасибо за подсказку. Я обновил свой вопрос. Я не уверен, что путаю эти термины, но я очень уверен, что хочу предоставить привилегии на уровне базы данных, а не на уровне схемы.





В PostgreSQL нет привилегий ALTER и CREATE. Пользователь базы данных, который должен иметь возможность запускать операторы ALTER и CREATE, должен быть владельцем объектов базы данных. Если у вас уже есть объекты, принадлежащие другому пользователю, вам придется изменить владельца.
Для другого пользователя вам придется предоставить привилегии для каждого объекта. Привилегии на БД не помогут — между объектами нет наследования привилегий. Не забудьте предоставить USAGE на схемах.
Я рекомендую вам создавать больше схем, чем public. Если у вас есть отдельная схема для объектов вашего приложения, вы можете использовать такие операторы, как
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA myapp TO someuser;
pg_read_all_dataопределенно не "применяется к схеме" - это глобальная роль. Пользователь с этой ролью может читать данные из любой таблицы. У меня также сложилось впечатление, что вы путаете термины «база данных» и «схема».