ruby-on-rails Rails:PG::权限不足:错误:关系schema_migrations的权限被拒绝

cuxqih21  于 2022-11-19  发布在  Ruby
关注(0)|答案(9)|浏览(191)

我尝试在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时,我看到数据库在那里。

64jmpszr

64jmpszr1#

我遇到了同样的问题,我通过向角色中添加“超级用户”来解决。
首先,列出使用者及其权限。如果您遵循上述指令,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                                                  | {}

希望能有所帮助。

hrirmatl

hrirmatl2#

我猜你错过了为你的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;
bwntbbo3

bwntbbo33#

我在使用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 mydatabase

\connect mydatabase

使用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(预设数据库使用者)修改为其他使用者,而且想要将拥有者修改为新的使用者时,这是必要的。

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

frebpwbc

frebpwbc4#

此外,如果您使用的是Heroku这样的服务,则值得检查一下您是否超出了行限制,以及数据库中的写访问权限是否已被撤销。
你可以通过进入 Jmeter 板,点击应用程序,点击postgres服务图标,然后检查行限制来完成。

ct2axkht

ct2axkht5#

以防万一有人来这里与同样的问题,我确实尝试了许多其他的解决方案,其中一个最适合我的是以下:在PostgreSQL中同时修改所有表的OWNER

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

mwg9r5ms6#

试着列出您的表以查看谁是所有者。在我的例子中,我通过psql < dump.sql导入了数据,所有导入的表都由postgres而不是我的用户拥有。
要对此进行检查,请启动psql并在数据库中输入命令\dt

public | schema_migrations | table | postgres

不好!它属于postgres,您需要修复它:
1.您可以在此处使用@ddreliv的solution重新分配每个表的所有者,或者
1.如果有转储,只需删除数据库,然后使用正确的用户重新导入它。例如,使用sudo -u my_user psql < dump.sql而不是sudo -u postgres psql < dump.sql

z9ju0rcb

z9ju0rcb7#

以下是我如何修复它:
登录到存储数据库的PostgreSQL控制台:
sudo -u postgres psql列出PostgreSQL数据库服务器中所有数据库:
\l

\list连接到要修复其权限的数据库:
\c我的数据库

\连接mydatabase
使用search_path列出当前数据库中的所有表:
日期

列出当前数据库中的所有表,而不考虑search_path:
\dt * 中指定的值。
然后给特权表:-

一个表

将TABLE side_adzone上的所有权限授予jerry;

方案的所有表

将公用方案中所有表的所有权限授予Jerry;

kb5ga3dv

kb5ga3dv8#

(使用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

问题解决了。

guz6ccqo

guz6ccqo9#

将“Superuser”添加到角色是一个安全问题,超级用户不仅可以删除OP指出的svp-chicago_development数据库,还可以删除任何其他存在的数据库。

我相信OP的问题与@kevin-cooper指出的表所有者有关。
即使OP执行了他所说的授予数据库所有权限和所有者的命令,如果OP仍然使用postgres凭据运行任何表创建或恢复转储,数据库svp-chicago_development上的表将以postgres作为所有者,如果应用程序以其他用户/角色运行,则将引发OP提到的错误。
您可以通过以下方法检查psql中是否存在这种情况:

\c svp-chicago_development

然后列出表:

\dt

它将显示如下内容:

Schema |    Name    | Type  |  Owner   
--------+------------+-------+----------
 public | table_name | table | postgres

如果有几行,则可以通过运行以下命令手动更改每行的所有者:

ALTER TABLE table_name OWNER TO new_owner;

如果您正在运行pg_restore,请确保传递**--role**,这样对象将由指定的角色拥有。

相关问题