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