0

我正在部署一个使用 PostgreSQL 和 HSTORE 的 Rails 应用程序。

为了部署它,我使用了Rubber

一切正常,除了 HSTORE 没有正确启用。当包含execute("CREATE EXTENSION hstore")运行的迁移时,我收到以下错误:

** [out :: production.---] 
** [out :: production.---] -- execute("CREATE EXTENSION hstore")
** [out :: production.---] 
** [out :: production.---] rake aborted!
** [out :: production.---] An error has occurred, this and all later migrations canceled:
** [out :: production.---] 
** [out :: production.---] PG::Error: ERROR:  permission denied to create extension "hstore"
** [out :: production.---] HINT:  Must be superuser to create this extension.

创建 postgres 实例的脚本具有以下代码:

create_user_cmd = "CREATE USER #{env.db_user} WITH NOSUPERUSER CREATEDB NOCREATEROLE"

所以我认为问题可能与NOSUPERUSER此处设置的属性有关。

有什么方法可以使用橡胶启用 hstore,同时保持大部分生成的文件不变?

4

2 回答 2

5

问题是橡胶将数据库用户创建为NOSUPERUSER. 我的解决方法是创建在 capistrano 之前和之后运行的任务,deploy:migrate这将改变用户SUPERUSER来回切换。

这是代码:

namespace :rubber do

  namespace :project do

    before "deploy:migrate", "rubber:project:add_pg_superuser_and_enable_hstore"
    after "deploy:migrate", "rubber:project:remove_pg_superuser"

    task :add_pg_superuser_and_enable_hstore,
         :roles => [:postgresql_master, :postgresql_slave] do
      alter_user_cmd = "ALTER USER #{rubber_env.db_user} SUPERUSER"
      create_hstore_cmd = "CREATE EXTENSION IF NOT EXISTS hstore;"
      rubber.sudo_script "add_superuser_create_hstore", <<-ENDSCRIPT
        sudo -i -u postgres psql -c "#{alter_user_cmd}"
        sudo -i -u postgres psql -c "#{create_hstore_cmd}"
      ENDSCRIPT
    end

    task :remove_pg_superuser, :roles => [:postgresql_master,
                                          :postgresql_slave] do
      alter_user_cmd = "ALTER USER #{rubber_env.db_user} NOSUPERUSER"
      rubber.sudo_script "add_superuser_create_hstore", <<-ENDSCRIPT
        sudo -i -u postgres psql -c "#{alter_user_cmd}"
      ENDSCRIPT
    end

  end

end
于 2013-03-01T18:59:18.963 回答
0

另一种选择是在部署时不涉及 postgres 超级用户,而是创建一个模板(或使用默认模板)并在模板上安装扩展。然后,当您创建数据库时,它将安装扩展。

很好的答案在这里这里

于 2013-12-31T09:57:55.703 回答