Rails:Postgres在运行rake db:create:all时拒绝创建数据库的权限

44

我正在尝试创建用于开发和测试的PostgreSQL数据库。 我使用的工具是:

  • OSX Yosemite操作系统
  • Rails版本:4.2.0
  • Git版本:2.2.2
  • psql版本:9.4.0
  • Ruby版本:2.1.0p0
  • HomeBrew版本:0.9.5

Gemfile文件内容:

gem 'pg'

database.yml:

default: &default
  adapter: postgresql
  encoding: unicode
  pool: 5

development:
  <<: *default
  database: myapp_development
  username: username
  password: 

test:
  <<: *default
  database: myapp_test

rake db:create:all 返回:

PG::InsufficientPrivilege: ERROR:  permission denied to create database
: CREATE DATABASE "myapp_development" ENCODING = 'unicode'
.... (lots of tracing)
Couldn't create database for {"adapter"=>"postgresql", "encoding"=>"unicode", "pool"=>5, "database"=>"myapp_development", "username"=>"username", "password"=>nil}
myapp_test already exists

出了什么问题?

编辑 我刚试着把database.yml中的用户名改成我在Mac上使用的用户名。它奏效了。它还告诉我,不仅maybe_test已经存在,它还告诉我myapp_development也已经存在。

  • 为什么它不能使用我创建并分配了CREATEDB角色的另一个用户名?
  • 为什么它说开发环境无法创建,然后告诉我它已经存在了?

这一切似乎太混乱了,让我想起了很早以前用Apache设置PHP时的情况。我不想每次创建新应用并尝试遵循Heroku建议在开发过程中使用PostgreSQL时都要处理问题。


2
rake db:drop:all 然后 rake db:create:all - Малъ Скрылевъ
5
跟随这个答案,授予你使用 CREATEDB 角色的权限。这样你的问题就会得到解决。然后执行 rake db:droprake db:create - Arup Rakshit
3个回答

120

在我的Ruby on Rails项目中,当运行rake db:test:prepare时,我遇到了与在postgresql中相同的问题。从错误消息很清楚,这是用户权限问题。我在控制台中添加了new_userCREATEDB权限。

要访问postgres控制台:

$ sudo -u postgres -i

postgres@host:~$ psql

在那里:

postgres=# ALTER USER new_user CREATEDB;

目前它的运行非常完美。你可能会遇到其他数据库所有权方面的问题,对此,你可以按以下命令更改数据库的权限所有者

postgres=# GRANT ALL PRIVILEGES ON  DATABASE database_name to new_user;
postgres=# ALTER DATABASE database_name owner to new_user;

非常感谢你。 - vidur punj
我们的环境中没有创建数据库权限。 - Marlin Pierce
非常感谢这个。 - oamandawi
3
有时您的用户可能没有足够的权限执行某些操作。如果将所有权限都授予该用户不是问题,也可以运行 ALTER ROLE new_user SUPERUSER;. - ADTC

0
create database demo;
create user demotest with password '123';
grant all privileges on database demo to demotest;
commit;

      This is script for creation of database. But any existing database having password '123' then change your password for new database to password '1234'. This procedure working for me.
 

1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

0

从您的模式图中可以看出,您的开发和测试凭据是不同的。

也许应该从模式图中删除用户名和密码,因为您的测试数据库已经创建成功了。


Rails创建了default变量,除非显式地覆盖,否则会将所有内容传递给下一个。因此,用户名和密码也会传递到myapp_test数据库。 - Beengie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接