2013-03-01 1 views
0

저는 PostgreSQL과 HSTORE를 사용하는 레일즈 애플리케이션을 배포하고 있습니다.고무를 사용하여 배포 할 때 hstore를 활성화하십시오.

배포하려면 rubber을 사용하고 있습니다.

HSTORE가 제대로 활성화되지 않은 것을 제외하면 모든 것이 작동합니다. execute("CREATE EXTENSION hstore") 실행을 포함 마이그레이션, 나는 다음과 같은 오류 얻을 때 :

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

그래서 난 문제가 NOSUPERUSER과 관련이있을 것 같아요 :

** [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. 

포스트그레스 인스턴스를 생성하는 스크립트를이 코드를 가지고 속성이 여기에 설정됩니다.

대부분의 생성 된 파일을 변경하지 않고 고무를 사용하여 hstore를 활성화하는 방법은 있습니까?

+0

보석류'activerecord-postgres-hstore'을 사용해 보았습니까? 그것은 마이그레이션에 의해 hstore의 기능을 설치합니다. –

+0

마이그레이션을 실행할 때 사용 권한에 문제가 있습니다. 나는 보석을 설치했다. – pgb

답변

5

고무는 DB 사용자를 NOSUPERUSER으로 만듭니다. 제 해결 방법은 카피스트라 노의 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

+0

일반 사용자가 수퍼 유저를 일반 용도로 사용하도록 권장해야한다고 생각하지 않습니다. Rubber는 사용자가 자유롭게 수정할 수있는 파일을 생성합니다. 생성 된 deploy-postgresql.rb를 수정하여 실행중인 다른 권한있는 SQL과 함께 확장을 생성해야합니다. – nirvdrum

0

또 다른 옵션을 배포 할 때 수퍼 유저 참여 포스트 그레스을 가지고 있지만 템플릿을 생성 (또는 기본값을 사용) 및 템플릿에 대한 확장을 설치하지 않는 것입니다. 그런 다음 데이터베이스를 만들면 확장이 설치됩니다.

좋은 답변 herehere.