PG :: InsufficientPrivilege:错误:关系schema_migrations的权限被拒绝rake db:create

时间:2016-07-08 16:20:46

标签: ruby-on-rails ruby postgresql

我正在尝试在Rails中创建数据库。在postgres中我看到了开发和测试数据库,但是我收到了权限错误。我试图按照这个链接,对我不起作用。

错误:default: &default adapter: postgresql encoding: unicode pool: 5 host: localhost username: root password: development: <<: *default database: svp-chicago_development

Rails: permission denied for relation schema_migrations

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

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

\list

当我{{1}}时,我看到数据库在那里。

6 个答案:

答案 0 :(得分:26)

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

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

length

接下来,将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

希望它有所帮助。

答案 1 :(得分:8)

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

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 :(得分:4)

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

您可以通过以下方式进行操作:转到仪表板,单击应用程序,单击postgres服务图标,然后检查行数限制。

答案 3 :(得分:1)

在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

OR

\list

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

\c database_name

OR

\connect database name

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

\dt

OR

列出当前数据库中的所有表,而不考虑您的search_path

\dt *.

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

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

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

ALTER TABLE table_name OWNER TO new_owner;

这不需要指定old_owner。当用户为postgres(默认数据库用户)并且您想要将所有者修改为新用户时,这一点很重要。

OR 与此同时修改所有表:

REASSIGN OWNED BY old_owner TO new_owner;

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

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

仅此而已。

我希望这会有所帮助

答案 4 :(得分:0)

以防万一其他人遇到同样的问题,我也尝试了许多其他解决方案,而对我来说最好的解决方案是:Modify OWNER on all tables simultaneously in PostgreSQL

  • 之所以可行,是因为我的用户(例如> solve.QP(Dmat,dvec,Amat,bvec) $solution [1] -0.8064516 0.2096774 $value [1] -0.04032258 root)拥有postgres权限,因此尝试REASSIGN OWNED尝试分配Superuser对象时会出错, li>
  • ALTER DATABASE无法正常工作,因为问题出在表对象所有权而不是数据库所有权上。在数据库上更改所有者不会传播到该数据库架构上的其他对象

答案 5 :(得分:0)

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

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

public | schema_migrations | table | postgres

不好!它归postgres所有,您需要解决以下问题:

  1. 您可以在此处使用@ddreliv的solution重新分配每个表的所有者,或者
  2. 如果有转储,只需删除数据库并以适当的用户重新导入它。例如,使用sudo -u my_user psql < dump.sql代替sudo -u postgres psql < dump.sql