pg_catalog
スキーマのオブジェクトは暗黙的にsearch_path
( docs )にあるので、そのスキーマに拡張機能をインストールすることをお勧めしますか?
pg_catalog
への拡張機能をインストールしないでください(デフォルトでない限り、そのように設計された拡張機能はほとんどありません)。システムカタログを変更しないためですever。 @ Chris は、その理由の1つを示しています。他にもあります。
ただし、 "public"スキーマは特別なものではありません。これは、標準ディストリビューションにプリインストールされているデフォルトのスキーマにすぎないため、すぐに始めることができます。一部のDB管理者は「パブリック」スキーマをまったく使用せず、削除することさえあります。
CREATE EXTENSION
は「パブリック」スキーマに属していません。他の指示がない限り、現在のスキーマにインストールされます-一部の拡張機能には事前設定されたスキーマがあります( PGQ/Londiste など)。 ドキュメント:
schema_name
拡張機能によってそのコンテンツの再配置が許可されている場合に、拡張機能のオブジェクトをインストールするスキーマの名前。名前付きスキーマはすでに存在している必要があります。指定されておらず、拡張機能の制御ファイルでもスキーマが指定されていない場合現在のデフォルトのオブジェクト作成スキーマが使用されます。
拡張自体はスキーマ内にあるとは見なされないことに注意してください。拡張には、データベース全体で一意でなければならない非修飾名があります。ただし、拡張に属するオブジェクトはスキーマ内に存在できます。
大胆な強調鉱山。
ユーザー、スキーマ、およびsearch_path
の管理方法を決定します。
次に、拡張機能をインストールする場所を決定します。選択した任意のスキーマにインストールして、そのスキーマをデフォルトのsearch_path
に含めることができます。これは、すべてのユーザーに対して、または一部またはすべてのユーザーに対してのみ可能です(したがって、修飾された参照が必要です)。それはすべて、何を達成したいかに依存します。
何をするにせよ、一貫性を保ちます。
私は拡張機能を(それを許可する)専用の「拡張機能」スキーマにインストールしたいと思います。これはデフォルトのsearch_path
after "public"(および "$ user "-それを使用する場合)。自分のパブリック関数と他のパブリックオブジェクトを明確に分離するのに役立ちます。 postgresql.conf
での私の設定:
search_path = "$user",public,extensions
または:
search_path = public,extensions
そして私は拡張機能をインストールします:
CREATE EXTENSION some_extension SCHEMA extensions;
注意事項:この方法で、extensions
スキーマ内の同じ名前(およびパラメーター)のオブジェクトの後ろにpublic
スキーマ内の(修飾されていない)オブジェクトを「隠す」ことができます。
関連:
拡張機能を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
スキーマを使用します。