web-dev-qa-db-ja.com

エラー:言語plpgsqlの所有者である必要があります

私はPostgreSQL v9.0.1Rails(そしてそれは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.28postgresgemの両方を使用しました-どちらも同じ動作を示します。

私のチームメートはPostgreSQL v8.4を実行します。ここで、言語のインストールは手動の手順です。

23
Lee Hambley

解決策は次のとおりです。

私のインストールには、標準のテンプレートtemplate0template1があります-少なくとも私が理解しているように、テンプレートが指定されていない限り、postgresは新しいデータベースを作成するときに最も大きい番号のtemplateNを探します。

この例では、template0plpgsqlが含まれているので、template1…も含まれています。サイト固有のデフォルトのニーズに合わせてtemplate1をカスタマイズするという考えです。すべてを爆破すると、template1からtemplate0が復元されます。

私のサイト固有の要件は、Webアプリケーションの自動ビルドの一部としてplpgsqlをインストールすることだったので(8.4の互換性を維持するために維持しなければならなかったステップ)-解決策は簡単でした:からplpgsqlを削除しますtemplate1そして警告/エラーは消えました。

サイト固有のデフォルトが変更され、デフォルトの動作に戻す必要がある場合は、単にtemplate1を削除して再作成します(template0を使用します)。

8
Lee Hambley

私も同じ問題を抱えていました。以下のコマンドでテンプレートを修正しました

psql template1
template1=# alter role my_user_name with superuser;

続きを読む http://gilesbowkett.blogspot.com/2011/07/error-must-be-owner-of-language-plpgsql.html

22
David Dehghan

新しい読者のために、私は自分のプロジェクトの1つでこのエラーに遭遇した後、この古い投稿を読みました。アプリのPostgreSQLにスーパーユーザーの役割を与えることはひどい考えであり、テンプレートを変更することも理想的ではないと強く感じています。 db:structure:dumpによって追加された参照PSQLコマンドはRailsアプリのデータベースでは必要ないため、structure.sqlの問題のある行をコメントアウトするカスタムrakeタスクを作成しました。そのコードをGithubの要点として https://Gist.github.com/rietta/7898366 で公開しました。

21
Frank

Rails_ENV=development bundle exec rake db:resetを実行しようとしたときに、このエラーが発生しました。代わりにRails_ENV=development bundle exec rake db:drop db:create db:migrateを実行することで、(私の目的のために)同じことを達成することができました。

2
Phil Loden

ダンプ後の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
0
bonkydog