2017-08-10 10 views
2

私は、いくつかの別々のカタログ(データベース)で使用する必要のある大きなユーザー定義プロシージャーを持っています。Postgresのユーザ定義関数をすべてのデータベースで使用できるようにするにはどうすればよいですか?

通常はpg_catalog.pg_procにある組み込みプロシージャは、すべてのデータベースのpg_catalogスキーマに反映されている であるように見えます。私は、postgresデータベースに関数を作成すると、postgres.pg_catalogまたはpostgres.publicスキーマで作成されたものであれ、汎用的にアクセスできるようにすることができます。

ユーザー定義プロシージャを普遍的に使用できるようにする方法を知っている人はいますか?

私は名前空間と所有者を偽装し、公開に実行を許可し、黒い猫を私の左肩に(満月ではなく)保持してみました。

拡張機能として設定しますか? (それは私の環境のためのいくつかの交渉とfinaglingが、私はまだそれを試していない唯一の理由であるかかる場合があります。)事前に

おかげ

+0

あなたはテンプレートdbに関数を置くことができ、新しいデータベースであればそれを持つことができます。さもなければ、拡張子があなたの最善の賭けです –

+0

それをテンプレートに入れれば、その半分が得られますが、同じことの多くのコピーを更新するというメンテナンスの頭痛が残ります。 拡張機能を試してみます。おかげで、Neil。 – user8446599

+0

最初のpostgres拡張機能が正常にインストールされましたが、それでも同じ問題があります。 私はpostgresスキーマでそれを作成し、それを正常に呼び出すことができますが、サンドボックススキーマから呼び出すと、 'ERROR:function ... does not exist。'というメッセージが表示されます。苦情。 私は助けることができませんが、私は行う必要がある他のものが不足していると思います。 postgres.pg_catalog.pg_available_extensionsでは、plpgsqlは 'installed_version'の値として1.0でリストされています。これにより、plpgsql自体 がこのようにロードされると思います。 (そして明らかにそれはどこでも利用可能です) 何か提案がありますか? – user8446599

答えて

2

PostgreSQLデータベースは非常に隔離されています。それぞれの拡張機能をインストールする必要があります。

for DB in $(psql -t -c "SELECT datname FROM pg_database WHERE datname NOT IN ('postgres', 'template0', 'template1')"); do 
    psql -d $DB -c "CREATE EXTENSION IF NOT EXISTS foo" 
done 

あなたが話している複数のスキーマを持つこの1つのデータベースは、次のとおりです。

+0

Neilに感謝します。複数のデータベースがあり、それぞれに複数のスキーマがあるため、シェルスクリプトは理論上は機能しますが、セキュリティモデルに合わせるには1分ほどかかることがあります); – user8446599

+0

良いアプローチ。ネストされた '-c" CREATE EXTENSION ... 'を' -f user_func.ddl'に置き換えて、このファイルで定義された関数をすべてのデータベースに作成することができます。 – beldaz

関連する問題