Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails:PG::InsufficientPrivilege:错误:拒绝关系架构_迁移的权限_Ruby On Rails_Ruby_Postgresql - Fatal编程技术网

Ruby on rails Rails:PG::InsufficientPrivilege:错误:拒绝关系架构_迁移的权限

Ruby on rails Rails:PG::InsufficientPrivilege:错误:拒绝关系架构_迁移的权限,ruby-on-rails,ruby,postgresql,Ruby On Rails,Ruby,Postgresql,我正在尝试在Rails中创建数据库。在Postgres中,我看到了开发和测试数据库,但是,我得到了一个权限错误。我尝试过跟踪这个链接,但对我无效 错误:PG::InsufficientPrivilege:错误:拒绝对关系架构迁移的权限:从“架构迁移”中选择“架构迁移”。* 当我执行\list时,我看到数据库就在那里。我想你没有为你的用户创建密码。尝试按以下方式创建密码: CREATE USER root WITH PASSWORD 'your_new_password'; CREATE DAT

我正在尝试在Rails中创建数据库。在Postgres中,我看到了开发和测试数据库,但是,我得到了一个权限错误。我尝试过跟踪这个链接,但对我无效

错误:
PG::InsufficientPrivilege:错误:拒绝对关系架构迁移的权限:从“架构迁移”中选择“架构迁移”。*


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

我想你没有为你的
用户创建
密码。尝试按以下方式创建密码:

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;

我也有同样的问题,我通过在角色中添加“超级用户”来解决

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

postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 other     | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 root      |                                                            | {}
接下来,将root升级为“超级用户”

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


希望能有帮助

为了防止其他人带着同样的问题来到这里,我尝试了许多其他的解决方案,其中对我最有效的是:

  • 这是因为我的用户(例如
    root
    postgres
    )具有
    超级用户
    权限,因此尝试分配
    系统
    对象时会出错
  • 不起作用,因为该问题与表对象所有权有关,而不在数据库所有权中。更改数据库上的所有者不会传播到该数据库架构上的其他对象

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


您可以通过进入仪表板,单击应用程序,单击postgres服务图标,然后检查行限制来完成此操作。

尝试列出您的表以查看所有者。在我的例子中,我通过
psql
导入了数据,所有导入的表都归
postgres
所有,而不是我的用户

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

public | schema_migrations | table | postgres
不好!它属于
postgres
所有,您需要修复它:

  • 您可以使用@ddreliv's here重新分配每个表的所有者,或者
  • 如果您有一个转储,只需删除数据库并使用适当的用户重新导入即可。例如,使用
    sudo-u my_user psql
    而不是
    sudo-u postgres psql

  • 我在使用PostgreSQL开发Rails 6应用程序时遇到了这个问题

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

    GRANT ALL PRIVILEGES ON DATABASE mydatabase TO myusername;
    
    但在我自己的例子中,问题的原因是我创建了一个数据库,然后将所有特权授予特定的用户。过了一段时间,我使用
    将数据库mydatabase上的所有权限授予myusername,授予另一个用户权限s

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

    以下是我如何修复它的方法

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

    sudo -u postgres psql
    
    列出该PostgreSQL数据库服务器中的所有数据库:

    \l
    

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

    \c database_name
    

    使用
    搜索路径列出当前数据库中的所有表:

    \dt
    
    \dt *.
    

    列出当前数据库中的所有表,而不考虑您的
    搜索路径

    \dt
    
    \dt *.
    
    您会注意到,这些表仍然引用初始的
    用户
    角色
    作为
    所有者

    现在,您必须修改这些表,以引用新的
    用户
    角色
    作为
    所有者

    您可以使用以下方法分别修改每个表:

    ALTER TABLE table_name OWNER TO new_owner;
    
    REASSIGN OWNED BY old_owner TO new_owner;
    
    这不需要指定
    旧所有者
    。当用户是
    postgres
    (默认数据库用户)并且您希望将所有者修改为新用户时,这一点非常重要

    使用以下命令同时修改所有表格:

    ALTER TABLE table_name OWNER TO new_owner;
    
    REASSIGN OWNED BY old_owner TO new_owner;
    
    这需要指定
    旧所有者
    。如果您已经将用户从
    postgres
    (默认数据库用户)修改为另一个用户,并且希望将所有者修改为新用户,则这一点至关重要

    注意:确保已连接到要修改其权限的数据库,否则可能会出错

    就这些


    我希望这有帮助

    可能是密码问题;尝试使用密码创建
    root
    用户,并将其包含在
    config/database.yml
    文件中。在这里记录我最近的大脑放屁,以防它对其他人有所帮助:)我在Render.com上设置了一个Rails应用程序,并获得了“PG::InsufficientPrivilege”,试图在其shell中运行“bin/Rails db:create”。然后意识到我已经通过他们的用户界面创建了数据库,我想要的是“bin/rakedb:schema:load”。我这样做了,我的postgres不断给出同样的错误。请您看一下以下对我有用的答案:注意:此解决方法是并且应该谨慎使用。适用于我的本地-dba的问题现在:)
    ALTER TABLE table_name OWNER TO new_owner;
    
    REASSIGN OWNED BY old_owner TO new_owner;