首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用橡胶部署时启用hstore

使用橡胶部署时启用hstore
EN

Stack Overflow用户
提问于 2013-03-02 02:17:21
回答 2查看 1.3K关注 0票数 0

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

为了部署它,我使用rubber

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

代码语言:javascript
复制
** [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实例的脚本具有以下代码:

代码语言:javascript
复制
create_user_cmd = "CREATE USER #{env.db_user} WITH NOSUPERUSER CREATEDB NOCREATEROLE"

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

有没有办法在保持大多数生成的文件不变的情况下启用使用橡胶的hstore?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-02 02:59:19

问题是,橡胶将数据库用户创建为NOSUPERUSER。我的解决方法是创建在capistrano的deploy:migrate之前和之后运行的任务,将用户更改为SUPERUSER,然后再返回。

代码如下:

代码语言:javascript
复制
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
票数 5
EN

Stack Overflow用户

发布于 2013-12-31 17:57:56

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

herehere回答得很好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15164262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档