私はPostgreSQL v9.0.1
とRails
(そしてそれはdeps)@ v2.3.8
を使用していますが、postgresの全文機能を使用しているため、次のように定義されたテーブルがあります。
CREATE TABLE affiliate_products( id integer NOT NULL、 name charactervariing(255)、 model charactervariing(255)、 説明テキスト、 pricenumeric(9,2)、 created_atタイムスタンプなしのタイムゾーン、 updated_atタイムスタンプなしのタイムゾーン;
最後の行に注意してください。これにより、アクティブレコードが標準のスキーマダンパーで処理できないようになるため、config.active_record.schema_format = :sql
に./config/environment.rb
を設定する必要があります。 rake db:test:clone_structure
の代わりにrake db:test:clone
を使用します。
これはそれほど目立ったものではなく、不便なだけですが、rake db:test:clone_structure
は次のエラーで失敗します。
ERROR: must be owner of language plpgsql
結果の#16
の行./db/development_schema.sql
のため:
CREATE OR REPLACE PROCEDURAL LANGUAGE plpgsql;
PostgreSQL v9.0+
の下で、言語plpsql
がスーパーユーザーによって初期テンプレートにインストールされ、その後、新しく作成されたスキーマで使用できるようになります。
これを解決せずにこのプロジェクトでテストを実行することはできません。また、./db/development_schema.sql
を手動で編集しても、rake db:test:clone_structure
を実行するたびに再生成されるため、無駄です(rake db:test:clone
によって無視されます)。
誰かがこれに光を当てることができるといいのですが?
注:pg 0.9.0
アダプタgemとバージョン0.7.9.2008.01.28
のpostgres
gemの両方を使用しました-どちらも同じ動作を示します。
私のチームメートはPostgreSQL v8.4
を実行します。ここで、言語のインストールは手動の手順です。
解決策は次のとおりです。
私のインストールには、標準のテンプレートtemplate0
とtemplate1
があります-少なくとも私が理解しているように、テンプレートが指定されていない限り、postgresは新しいデータベースを作成するときに最も大きい番号のtemplateN
を探します。
この例では、template0
にplpgsql
が含まれているので、template1
…も含まれています。サイト固有のデフォルトのニーズに合わせてtemplate1
をカスタマイズするという考えです。すべてを爆破すると、template1
からtemplate0
が復元されます。
私のサイト固有の要件は、Webアプリケーションの自動ビルドの一部としてplpgsql
をインストールすることだったので(8.4の互換性を維持するために維持しなければならなかったステップ)-解決策は簡単でした:からplpgsql
を削除しますtemplate1
そして警告/エラーは消えました。
サイト固有のデフォルトが変更され、デフォルトの動作に戻す必要がある場合は、単にtemplate1
を削除して再作成します(template0
を使用します)。
私も同じ問題を抱えていました。以下のコマンドでテンプレートを修正しました
psql template1
template1=# alter role my_user_name with superuser;
続きを読む http://gilesbowkett.blogspot.com/2011/07/error-must-be-owner-of-language-plpgsql.html
新しい読者のために、私は自分のプロジェクトの1つでこのエラーに遭遇した後、この古い投稿を読みました。アプリのPostgreSQLにスーパーユーザーの役割を与えることはひどい考えであり、テンプレートを変更することも理想的ではないと強く感じています。 db:structure:dump
によって追加された参照PSQLコマンドはRailsアプリのデータベースでは必要ないため、structure.sqlの問題のある行をコメントアウトするカスタムrakeタスクを作成しました。そのコードをGithubの要点として https://Gist.github.com/rietta/7898366 で公開しました。
Rails_ENV=development bundle exec rake db:reset
を実行しようとしたときに、このエラーが発生しました。代わりにRails_ENV=development bundle exec rake db:drop db:create db:migrate
を実行することで、(私の目的のために)同じことを達成することができました。
ダンプ後のstructure.sqlファイルからplpgsql拡張ステートメントをフィルタリングするだけです。
# lib/tasks/db.rake
namespace :db do
desc "Fix 'ERROR: must be owner of extension plpgsql' complaints from Postgresql"
task :fix_psql_dump do |task|
filename = ENV['DB_STRUCTURE'] || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, "structure.sql")
sql = File.read(filename)
sql.sub!(/(CREATE EXTENSION IF NOT EXISTS plpgsql)/, '-- \1')
sql.sub!(/(COMMENT ON EXTENSION plpgsql)/, '-- \1')
File.open(filename, 'w') do |f|
f.write(sql)
end
task.reenable
end
end
Rake::Task["db:structure:dump"].enhance do
Rake::Task["db:fix_psql_dump"].invoke
end