【问题标题】:Rails: PG::InsufficientPrivilege: ERROR: permission denied for relation schema_migrationsRails:PG :: InsufficientPrivilege:错误:关系schema_migrations的权限被拒绝
【发布时间】:2016-11-11 07:13:45
【问题描述】:

我正在尝试在 Rails 中创建数据库。在 Postgres 中,我看到了开发和测试数据库,但是,我遇到了权限错误。我尝试点击此链接,但对我不起作用。

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

Rails: permission denied for relation schema_migrations

default: &default
  adapter: postgresql
  encoding: unicode
  pool: 5
  host: localhost
  username: root
  password:

development:
  <<: *default
  database: svp-chicago_development

我登录到 postgres 并执行了这些命令。

psql postgres
CREATE USER root
CREATE DATABASE svp-chicago_development
GRANT ALL PRIVILEGES ON DATABASE svp-chicago_development to root
ALTER DATABASE svp-chicago_development OWNER TO root

当我执行\list 时,我看到数据库在那里。

【问题讨论】:

  • 可能是密码问题;尝试使用密码创建root 用户,并将其包含在config/database.yml 文件中。
  • 在这里记录我最近的大脑放屁,以防它帮助其他人:) 我在 Render.com 上设置了一个 Rails 应用程序并得到“PG::InsufficientPrivilege”试图运行“bin/rails db:在他们的外壳中创建”。然后意识到我已经通过他们的 UI 创建了数据库,我想要的是“bin/rake db:schema:load”。

标签: ruby-on-rails ruby postgresql


【解决方案1】:

我猜你错过了为你的user 创建password。尝试创建密码如下:

CREATE USER root WITH PASSWORD 'your_new_password';
CREATE DATABASE svp-chicago_development;
GRANT ALL PRIVILEGES ON DATABASE svp-chicago_development to root;
ALTER DATABASE svp-chicago_development OWNER TO root;

【讨论】:

【解决方案2】:

我遇到了同样的问题,我通过将“超级用户”添加到角色来解决。

首先,列出用户及其权限。如果您遵循上述命令,则 root 用户没有“超级用户”属性。

postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 other     | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 root      |                                                            | {}

接下来,将 root 升级为“超级用户”。

postgres=# ALTER USER root WITH SUPERUSER;
ALTER ROLE

再次列出用户及其权限。现在 root 有了“超级用户”。

postgres=# \du
                               List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 other     | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 root      | Superuser                                                  | {}

希望对您有所帮助。

【讨论】:

  • 注意:此解决方法是dangerous,应谨慎使用。
【解决方案3】:

以防万一其他人遇到同样的问题,我确实尝试了许多其他解决方案,最适合我的解决方案如下:Modify OWNER on all tables simultaneously in PostgreSQL

  • 这很有效,因为我的用户(例如 rootpostgres)拥有 Superuser 权限,因此尝试 REASSIGN OWNED 在尝试分配 system 对象时出错
  • ALTER DATABASE 不起作用,因为问题在于表对象所有权而不是数据库所有权。更改数据库上的所有者不会传播到该数据库架构上的其他对象

【讨论】:

    【解决方案4】:

    此外,如果您使用的是 Heroku 之类的服务,则值得检查一下您是否超出了行限制并且数据库中的写入权限已被撤销。

    您可以通过转到仪表板,单击应用程序,单击 postgres 服务图标,然后检查行限制来做到这一点。

    【讨论】:

      【解决方案5】:

      尝试列出您的表以查看所有者是谁。就我而言,我通过psql &lt; dump.sql 导入了数据,所有导入的表都归postgres 所有,而不是我的用户。

      要检查这一点,请启动 psql 并在您的数据库中输入命令 \dt。查找以下行:

      public | schema_migrations | table | postgres
      

      不好!它归 postgres 所有,您需要修复它:

      1. 您可以在此处使用@ddreliv 的solution 重新分配每个表的所有者,或者
      2. 如果您有转储,只需删除数据库并使用正确的用户重新导入即可。例如,使用sudo -u my_user psql &lt; dump.sql 而不是sudo -u postgres psql &lt; dump.sql

      【讨论】:

        【解决方案6】:

        我在使用 PostgreSQL 处理 Rails 6 应用程序时遇到了这个问题。

        第一个检查是确保您已将数据库的所有权限授予您要使用的特定用户:

        GRANT ALL PRIVILEGES ON DATABASE mydatabase TO myusername;
        

        但就我自己而言,问题的原因是我创建了一个数据库,然后将所有特权授予特定用户 .一段时间后,我使用GRANT ALL PRIVILEGES ON DATABASE mydatabase TO myusername;

        授予另一个用户 特权

        因此,即使我授予第二个用户所有权限,它也无权对数据库表执行操作。

        这是我修复它的方法

        登录到存储数据库的 PostgreSQL 控制台:

        sudo -u postgres psql
        

        列出该 PostgreSQL 数据库服务器中的所有数据库:

        \l
        

        \list
        

        连接到您要修复其权限的数据库:

        \c database_name
        

        \connect database name
        

        使用search_path列出当前数据库中的所有表:

        \dt
        

        列出当前数据库中的所有表,不管你的search_path

        \dt *.
        

        您会注意到,这些表仍将初始 userrole 引用为 owner

        现在您必须修改表以将新的userrole 引用为owner

        您可以使用以下方法单独修改每个表:

        ALTER TABLE table_name OWNER TO new_owner;
        

        这不需要指定old_owner。当用户是postgres(默认数据库用户)并且您想将所有者修改为新用户时,这是必不可少的。

        使用此命令同时修改所有表:

        REASSIGN OWNED BY old_owner TO new_owner;
        

        这需要指定old_owner。当您已经将用户从postgres(默认数据库用户)修改为另一个用户并且您想将所有者修改为新用户时,这是必不可少的。

        注意:确保您已连接到要为其修改权限/权限的数据库,否则您可能会遇到错误。

        就是这样。

        我希望这会有所帮助

        【讨论】:

        • 这正是我所面临的,我首先在 Mac 上用我的 OS 用户创建了数据库,然后我创建了另一个用户,它对该数据库无能为力,所以我不得不检查所有这些步骤到REASSIGN 所有者用户并且工作正常。谢谢!
        【解决方案7】:

        对于我们的案例(使用 docker-compose

        删除 postgres 数据

        $ docker-compose down # CAUTION: may cause data loss
        $ docker volume rm XXX_DB_VOLUME # CAUTION: will cause data loss
        

        然后在 docker-compose.yml 中将 postgres 从 11.11 降级到 11.8

        xxx_db:
          image: "postgres:11.8"
        

        终于再次启动 postgres docker

        $ docker-compose up -d
        

        问题解决了。

        【讨论】:

          猜你喜欢
          • 2015-11-14
          • 2015-10-13
          • 1970-01-01
          • 1970-01-01
          • 2016-02-21
          • 1970-01-01
          • 2022-06-13
          • 2012-11-08
          • 2014-11-10
          相关资源
          最近更新 更多