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


回答:


16

拡張機能をインストールしないでください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ます。

関連:


では、plpgsql拡張はどういうわけかこのルールの例外ですか?私が見たすべてのインストールのpg_catalogにこの拡張があります
zam6ak

@ zam6ak:はい、plpgsqlは少し特殊なケースです。マニュアルの引用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.
Erwin Brandstetter '20

1
plv8もにインストールされpg_catalogます。(変更しようとすると、エラーがスローされます。)これは、関数の手続き型言語拡張機能をインストールするための標準ですか?
jpmc26 2016年

6

拡張機能をにインストールすること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拡張機能にはデフォルトのスキーマを使用するだけです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.