web-dev-qa-db-ja.com

拡張機能をpg_catalogスキーマにインストールすることをお勧めしますか?

pg_catalogスキーマのオブジェクトは暗黙的にsearch_pathdocs )にあるので、そのスキーマに拡張機能をインストールすることをお勧めしますか?

11
zam6ak

pg_catalogへの拡張機能をインストールしないでください(デフォルトでない限り、そのように設計された拡張機能はほとんどありません)。システムカタログを変更しないためですever@ Chris は、その理由の1つを示しています。他にもあります。

ただし、 "public"スキーマは特別なものではありません。これは、標準ディストリビューションにプリインストールされているデフォルトのスキーマにすぎないため、すぐに始めることができます。一部のDB管理者は「パブリック」スキーマをまったく使用せず、削除することさえあります。

CREATE EXTENSIONは「パブリック」スキーマに属していません。他の指示がない限り、現在のスキーマにインストールされます-一部の拡張機能には事前設定されたスキーマがあります( PGQ/Londiste など)。 ドキュメント:

schema_name

拡張機能によってそのコンテンツの再配置が許可されている場合に、拡張機能のオブジェクトをインストールするスキーマの名前。名前付きスキーマはすでに存在している必要があります。指定されておらず、拡張機能の制御ファイルでもスキーマが指定されていない場合現在のデフォルトのオブジェクト作成スキーマが使用されます

拡張自体はスキーマ内にあるとは見なされないことに注意してください。拡張には、データベース全体で一意でなければならない非修飾名があります。ただし、拡張に属するオブジェクトはスキーマ内に存在できます。

大胆な強調鉱山。
ユーザー、スキーマ、およびsearch_pathの管理方法を決定します。

次に、拡張機能をインストールする場所を決定します。選択した任意のスキーマにインストールして、そのスキーマをデフォルトのsearch_pathに含めることができます。これは、すべてのユーザーに対して、または一部またはすべてのユーザーに対してのみ可能です(したがって、修飾された参照が必要です)。それはすべて、何を達成したいかに依存します。
何をするにせよ、一貫性を保ちます。

私は拡張機能を(それを許可する)専用の「拡張機能」スキーマにインストールしたいと思います。これはデフォルトのsearch_pathafter "public"(および "$ user "-それを使用する場合)。自分のパブリック関数と他のパブリックオブジェクトを明確に分離するのに役立ちます。 postgresql.confでの私の設定:

search_path = "$user",public,extensions

または:

search_path = public,extensions

そして私は拡張機能をインストールします:

CREATE EXTENSION some_extension SCHEMA extensions;

注意事項:この方法で、extensionsスキーマ内の同じ名前(およびパラメーター)のオブジェクトの後ろにpublicスキーマ内の(修飾されていない)オブジェクトを「隠す」ことができます。

関連:

16

拡張機能をpg_catalogにインストールすることは、私の知る限り、お勧めできません。デフォルトのpublicスキーマを使用する必要があります。これは、デフォルトでsearch_pathにも含まれています。

なぜ?

例として、pageinspectスキーマ内にすでに作成したpublic拡張機能を使用します。すべての関数は、publicスキーマにある場合、デフォルトでデータベース内のすべてのスキーマにアクセスできます。

ここで、pg_catalogスキーマに移動してみます。

ALTER EXTENSION pageinspect SET SCHEMA pg_catalog;

そしてそれはうまく働きます。

だが...

もう一度移動して、publicスキーマに戻します。

ALTER EXTENSION pageinspect SET SCHEMA public;

そしてそれはそれを許可しません、次のエラーをもたらします

ERROR: cannot remove dependency on schema pg_catalog because it is a system object
SQL state: 0A000

ええとああ!まあ、動かさなくても大丈夫です。ドロップして再作成するだけで、publicスキーマに戻すことができますよね?...

DROP EXTENSION pageinspect;
CREATE EXTENSION pageinspect;

ようし。いいぞ。 publicスキーマの正しい場所に戻ります。関数は、データベース内のすべてのスキーマに引き続きアクセスできます。

TL、DR;拡張機能にはデフォルトのpublicスキーマを使用します。

6
Chris