Миграция Rails и PostgreSQL: отдельный пользователь для миграции и установка привилегий для производственного пользователя

У меня есть два пользователя в postgresql, один из которых называется migration и используется, когда Rails запускает миграции на рабочем сервере. Этот пользователь владеет производственной базой данных. У меня также есть пользователь production, который должен иметь только следующие привилегии: SELECT, INSERT, UPDATE, DELETE в производственной базе данных.

Проблема в том, что каждый раз, когда создается новая таблица, мне приходится вручную запускать ее в psql:

GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO production;

-- next line is needed for each new table which has an auto incrementing field, in this case - table `users`
GRANT USAGE, SELECT ON SEQUENCE users_id_seq TO production;

потому что разрешения для пользователя production на вновь созданные таблицы не устанавливаются автоматически. Как лучше всего сделать это автоматически при выполнении миграции? Есть ли скрипт для Rails/Capistrano?


person snitko    schedule 23.05.2012    source источник
comment
Привилегии по умолчанию работали на вас? У меня очень похожая проблема, за исключением того, что она связана с моим программным обеспечением для резервного копирования. Каждый раз, когда создается новая таблица, пользователь резервного копирования не может ее прочитать... тем не менее, я использую привилегии по умолчанию, что ясно видно из \ddp.   -  person Joe McDonagh    schedule 03.09.2015


Ответы (1)


Вы можете использовать ALTER DEFAULT PRIVILEGES Postgres, чтобы он автоматически назначал права в производство для всех вновь созданных таблиц.

В качестве альтернативы вы можете написать пользовательскую задачу Capistrano для установки разрешений, вызываемых через хук after "deploy:migrate", "mycustomtaskname". Эта паста может дать вам несколько полезных советов о том, как взаимодействовать с pgsql через Capistrano, например, как указать пароль интерактивно.

person janfoeh    schedule 23.05.2012
comment
Спасибо, похоже, что ALTER DEFAULT PRIVILIGES избавит меня от написания собственной задачи Capistrano и очень хорошо заменит оба оператора GRANT в моем вопросе. Я отмечу ответ как правильный, как только проверю, насколько хорошо работает первое решение. - person snitko; 23.05.2012