2013-03-01 34 views
0

我正在部署使用PostgreSQL和HSTORE的Rails應用程序。我需要rubber使用橡皮部署時啓用hstore

一切正常,除非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?

+0

你試過了gem'activerecord-postgres-hstore'嗎?它通過遷移來安裝hstore的功能。 – 2013-03-01 18:34:19

+0

問題在於運行遷移時的權限。我安裝了寶石。 – pgb 2013-03-01 18:57:09

回答

5

問題是橡膠創建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 
+0

這應該是被接受的答案。我將它添加到我的config/deploy.rb的底部,並且我已備份並運行。謝謝! – eddieroger 2014-07-10 02:47:48

+0

我不認爲我們應該推薦人們啓用超級用戶作爲一般用途的答案。橡膠生成可自由修改的文件。您應該修改生成的deploy-postgresql.rb以創建擴展以及正在執行的其他特權SQL。 – nirvdrum 2016-01-21 14:10:32

0

另一種選擇是沒有Postgres的部署時,超級用戶參與,但創建一個模板(或使用默認的一個),並安裝模板上的延伸。然後當你創建一個數據庫時,它將會安裝擴展。

好答案here和​​。