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

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

我尝试在Rails中创建数据库。在Postgres中,我看到了开发和测试数据库,但是,我得到了一个权限错误。我试着跟随这个链接,对我不起作用。
错误:PG::InsufficientPrivilege: ERROR: permission denied for relation schema_migrations : SELECT "schema_migrations".* FROM "schema_migrations"
Rails: permission denied for relation schema_migrations

  1. default: &default
  2. adapter: postgresql
  3. encoding: unicode
  4. pool: 5
  5. host: localhost
  6. username: root
  7. password:
  8. development:
  9. <<: *default
  10. database: svp-chicago_development

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

  1. psql postgres
  2. CREATE USER root
  3. CREATE DATABASE svp-chicago_development
  4. GRANT ALL PRIVILEGES ON DATABASE svp-chicago_development to root
  5. ALTER DATABASE svp-chicago_development OWNER TO root

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

64jmpszr

64jmpszr1#

我遇到了同样的问题,我通过向角色中添加“超级用户”来解决。
首先,列出使用者及其权限。如果您遵循上述指令,root使用者就没有“超级使用者”属性。

  1. postgres=# \du
  2. List of roles
  3. Role name | Attributes | Member of
  4. -----------+------------------------------------------------------------+-----------
  5. other | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
  6. root | | {}

下一步,将root升级为“超级用户”。

  1. postgres=# ALTER USER root WITH SUPERUSER;
  2. ALTER ROLE

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

  1. postgres=# \du
  2. List of roles
  3. Role name | Attributes | Member of
  4. -----------+------------------------------------------------------------+-----------
  5. other | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
  6. root | Superuser | {}

希望能有所帮助。

展开查看全部
hrirmatl

hrirmatl2#

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

  1. CREATE USER root WITH PASSWORD 'your_new_password';
  2. CREATE DATABASE svp-chicago_development;
  3. GRANT ALL PRIVILEGES ON DATABASE svp-chicago_development to root;
  4. ALTER DATABASE svp-chicago_development OWNER TO root;
bwntbbo3

bwntbbo33#

我在使用PostgreSQL开发Rails 6应用程序时遇到了这个问题。
第一项检查是确保已将数据库的所有权限授予要使用的特定用户:

  1. GRANT ALL PRIVILEGES ON DATABASE mydatabase TO myusername;

但在我自己的案例中,问题的原因是我创建了一个数据库,然后将所有权限授予了一个特定的用户。一段时间后,我使用GRANT ALL PRIVILEGES ON DATABASE mydatabase TO myusername;权限授予了另一个用户
因此,第二个用户即使我授予了它所有权限,也没有权限对数据库表执行操作。

以下是我的修正方法

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

  1. sudo -u postgres psql

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

  1. \l

  1. \list

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

  1. \c mydatabase

  1. \connect mydatabase

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

  1. \dt


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

  1. \dt *.

您会注意到,这些表仍然将初始的userrole引用为owner
现在,您必须修改这些表,以将新的userrole引用为owner
您可以使用以下命令分别修改每个表:

  1. ALTER TABLE table_name OWNER TO new_owner;

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

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

  1. 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

  1. 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数据

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

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

  1. xxx_db:
  2. image: "postgres:11.8"

最后再次启动postgres Docker

  1. $ docker-compose up -d

问题解决了。

guz6ccqo

guz6ccqo9#

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

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

  1. \c svp-chicago_development

然后列出表:

  1. \dt

它将显示如下内容:

  1. Schema | Name | Type | Owner
  2. --------+------------+-------+----------
  3. public | table_name | table | postgres

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

  1. ALTER TABLE table_name OWNER TO new_owner;

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

展开查看全部

相关问题