Rails:关系模式迁移的权限被拒绝

12

我正在尝试为一个Ruby on Rails网络应用程序设置本地的生产环境。我可以使用rails server命令运行该应用程序,以获得开发环境。

我要设置的生产环境是纯粹的本地环境,并且我已经按照以下教程使用apache 2进行设置:https://www.digitalocean.com/community/tutorials/how-to-setup-a-rails-4-app-with-apache-and-passenger-on-centos-6

然而,当我访问我的应用程序页面时,出现以下错误:

PG::InsufficientPrivilege: ERROR: permission denied for relation schema_migrations : SELECT "schema_migrations".* FROM "schema_migrations"

在我的database.yml文件中,我为开发和生产设置了以下配置:

adapter: postgresql
database: whiteboard
username:
password:
pool: 5
timeout: 5000

无论如何,我都不能更改这些设置。

有没有办法解决这个问题?(如果有,请逐步说明)

2个回答

11

看起来您需要在数据库上创建一个具有所需权限的DB用户。 例如,我认为您可以通过登录您的数据库控制台,然后执行以下操作来完成:

CREATE USER your_new_username WITH PASSWORD 'your_new_password';
CREATE DATABASE whiteboard;
GRANT ALL PRIVILEGES ON DATABASE whiteboard to your_new_username;
ALTER DATABASE whiteboard OWNER TO your_new_username;

然后像这样更新您的database.yml:

adapter: postgresql
database: whiteboard
username: your_new_username
password: your_new_password
pool: 5
timeout: 5000
希望它有所帮助!

很遗憾,我无法更改database.yml文件。如果其他团队使用此文件运行了事情,那么应该是可能的。有没有想过创建一个空用户? - Victoria S.
也许他们正在使用像Capistrano这样的解决方案来部署代码。 你应该看一下关于为Rails应用程序设置VPS的伟大Railscasts http://railscasts.com/episodes/335-deploying-to-a-vps - Olivier
我忘记了原因,但我尝试了GRANT ALL PRIVILEGES ON DATABASE whiteboard TO nobody,现在应用程序可以运行了!显然我为Apache创建了一个名为nobody的用户。我也会查看您发布的链接,这可能是更好的解决方案。 - Victoria S.
很高兴听到这个消息,尽管我不确定这是否是拥有防弹环境的最佳方式。我建议你学习更多关于如何设置生产环境的知识,Capistrano非常简单易学,可以改变你的游戏规则,即使它不是你唯一的选择,在生产中被很多人使用。 - Olivier
我已经尝试了这个方法,但我的Postgres仍然出现相同的错误。您能否请看一下此链接(http://stackoverflow.com/questions/41424654/postgres-permission-denied-for-relation-schema-migrations)? - Code-MonKy

0

我正在使用dbmate,它在启动时也会创建一个名为schema_migrations的表,因此当应用完全转储具有相同表的内容时会失败。以下是一些方法:

  1. PostgreSQL不支持使用IF NOT EXISTS创建转储,与mysql不同:

请参见Can pg_dump be instructed to create tables with "IF NOT EXISTS"?

  1. 然而,PostgreSQL 9.1及更高版本支持CREATE TABLE IF NOT EXISTS语法,因此您可以使用sed进行字符串替换,例如:

    sed -i 's/CREATE TABLE/CREATE TABLE IF NOT EXISTS/g' dump.sql

  2. 但实际上,我最终删除了转储中带有schema_migrations的行以及+1-2行:

    sed -i '/CREATE TABLE public.schema_migrations (/,+2 d' dump.sql

    sed -i '/ALTER TABLE ONLY public.schema_migrations/,+1 d' dump.sql


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接