【问题标题】:Rails: permission denied for relation schema_migrationsRails:关系 schema_migrations 的权限被拒绝
【发布时间】:2016-02-21 11:05:11
【问题描述】:

我正在尝试为 Ruby on Rails Web 应用程序设置本地生产环境。我可以使用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

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

有没有办法解决这个问题? (如果是,请一步一步)

【问题讨论】:

    标签: ruby-on-rails postgresql apache2


    【解决方案1】:

    看来您必须在您的数据库上创建一个拥有所有所需权限的数据库用户。 例如,我认为您可以通过登录数据库控制台然后执行以下操作来达到此目的:

    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 文件。如果其他团队使用此文件进行操作,那应该是可能的。知道是否可以创建一个空用户?
    • 可能他们正在使用像 capistrano 这样的解决方案来部署代码。你应该看看关于为 Rails 应用程序设置 VPS 的伟大 Railscasts railscasts.com/episodes/335-deploying-to-a-vps
    • 我忘记了原因,但我尝试了GRANT ALL PRIVILEGES ON DATABASE whiteboard TO nobody,现在应用程序运行了!显然,我在某个地方为 apache 设置了一个 nobody 用户。我也会查看您发布的链接,这可能是一个更好的解决方案。
    • 这里很好,即使我不确定这是拥有防弹环境的最佳方式。我建议您了解有关如何设置生产环境的更多信息,Capistrano 非常简单易学,可以成为您的游戏规则改变者,即使它不是您唯一的选择,但很多人在生产中使用它.
    • 我这样做了,我的 postgres 继续给出同样的错误。请看一下link
    【解决方案2】:

    我使用的是 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-11
      • 2015-11-14
      • 2015-10-13
      • 2013-03-09
      • 2019-12-18
      • 2016-02-25
      • 2014-04-30
      • 2014-08-19
      相关资源
      最近更新 更多