0

PostgreSQLとHSTOREを使用するRailsアプリをデプロイしています。

それを展開するために、私はラバーを使用しています。

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したがって、問題はここで設定されている属性に関連している可能性があると思います。

生成されたファイルのほとんどを変更せずに、rubberを使用してhstoreを有効にする方法はありますか?

4

2 に答える 2

5

問題は、rubberがDBユーザーをとして作成すること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

もう1つのオプションは、デプロイ時にpostgresスーパーユーザーを関与させずに、テンプレートを作成して(またはデフォルトのテンプレートを使用して)、テンプレートに拡張機能をインストールすることです。次に、データベースを作成すると、拡張機能がインストールされます。

ここここで良い答え。

于 2013-12-31T09:57:55.703 に答える