Rails:关系 schema_migrations 的权限被拒绝
Rails: permission denied for relation schema_migrations
我正在尝试为 Ruby on Rails 网络应用程序设置本地生产环境。我可以 运行 使用 rails server
命令的应用程序,它提供了开发环境。
我尝试设置的生产环境完全是本地的,我已经按照本教程使用 apache 2 进行设置:https://www.digitalocean.com/community/tutorials/how-to-setup-a-rails-4-app-with-apache-and-passenger-on-centos-6
然而,当我转到我的应用程序页面时,出现以下错误:
PG::InsufficientPrivilege: ERROR: permission denied for relation schema_migrations : SELECT "schema_migrations".* FROM "schema_migrations"
在我的 database.yml 中,我有这些开发和生产设置:
adapter: postgresql
database: whiteboard
username:
password:
pool: 5
timeout: 5000
无论如何,我都不允许更改这些设置。
有什么办法可以解决这个问题吗? (如果是,请一步步来)
看来您必须创建一个对您的数据库具有所有所需权限的数据库用户。
例如,我认为您可以通过登录您的数据库控制台然后执行类似以下操作来解决这个问题:
CREATE USER your_new_username WITH PASSWORD 'your_new_password';
CREATE DATABASE whiteboard;
GRANT ALL PRIVILEGES ON DATABASE whiteboard to your_new_username;
ALTER DATABASE whiteboard OWNER TO your_new_username;
然后像这样database.yml
更新你:
adapter: postgresql
database: whiteboard
username: your_new_username
password: your_new_password
pool: 5
timeout: 5000
希望对您有所帮助!
我使用的是 dbmate,它还在启动时创建了一个名为 schema_migrations 的 table,因此在应用具有相同 table 的完整转储时失败。这里有一些方法
- PostgreSQL 不支持使用 IF NOT EXISTS 创建转储,不像 mysql:
见Can pg_dump be instructed to create tables with "IF NOT EXISTS"?
但是,PostgreSQL 9.1 和更新版本支持 CREATE TABLE IF NOT EXISTS -语法,因此您可以使用 sed:
等字符串替换转储
sed -i 's/CREATE TABLE/CREATE TABLE IF NOT EXISTS/g' dump.sql
但实际上,我最后从转储中删除了带有 schema_migrations 的行,以及以下 +1-2 行:
sed -i '/CREATE TABLE public.schema_migrations (/,+2 d' dump.sql
sed -i '/仅更改 TABLE public.schema_migrations/,+1 d' dump.sql
我正在尝试为 Ruby on Rails 网络应用程序设置本地生产环境。我可以 运行 使用 rails server
命令的应用程序,它提供了开发环境。
我尝试设置的生产环境完全是本地的,我已经按照本教程使用 apache 2 进行设置:https://www.digitalocean.com/community/tutorials/how-to-setup-a-rails-4-app-with-apache-and-passenger-on-centos-6
然而,当我转到我的应用程序页面时,出现以下错误:
PG::InsufficientPrivilege: ERROR: permission denied for relation schema_migrations : SELECT "schema_migrations".* FROM "schema_migrations"
在我的 database.yml 中,我有这些开发和生产设置:
adapter: postgresql
database: whiteboard
username:
password:
pool: 5
timeout: 5000
无论如何,我都不允许更改这些设置。
有什么办法可以解决这个问题吗? (如果是,请一步步来)
看来您必须创建一个对您的数据库具有所有所需权限的数据库用户。 例如,我认为您可以通过登录您的数据库控制台然后执行类似以下操作来解决这个问题:
CREATE USER your_new_username WITH PASSWORD 'your_new_password';
CREATE DATABASE whiteboard;
GRANT ALL PRIVILEGES ON DATABASE whiteboard to your_new_username;
ALTER DATABASE whiteboard OWNER TO your_new_username;
然后像这样database.yml
更新你:
adapter: postgresql
database: whiteboard
username: your_new_username
password: your_new_password
pool: 5
timeout: 5000
希望对您有所帮助!
我使用的是 dbmate,它还在启动时创建了一个名为 schema_migrations 的 table,因此在应用具有相同 table 的完整转储时失败。这里有一些方法
- PostgreSQL 不支持使用 IF NOT EXISTS 创建转储,不像 mysql:
见Can pg_dump be instructed to create tables with "IF NOT EXISTS"?
但是,PostgreSQL 9.1 和更新版本支持 CREATE TABLE IF NOT EXISTS -语法,因此您可以使用 sed:
等字符串替换转储sed -i 's/CREATE TABLE/CREATE TABLE IF NOT EXISTS/g' dump.sql
但实际上,我最后从转储中删除了带有 schema_migrations 的行,以及以下 +1-2 行:
sed -i '/CREATE TABLE public.schema_migrations (/,+2 d' dump.sql
sed -i '/仅更改 TABLE public.schema_migrations/,+1 d' dump.sql