it-swarm.com.de

Wird empfohlen, Erweiterungen im Schema pg_catalog zu installieren?

Da Objekte in pg_catalog Schema sind implizit im search_path ( docs ), wird empfohlen, Erweiterungen in diesem Schema zu installieren?

11
zam6ak

Installieren Sie keine Erweiterungen für pg_catalog (Es sei denn, dies ist ihre Standardeinstellung: Nur sehr wenige Erweiterungen sind so konzipiert), da Sie nicht mit dem Systemkatalog herumspielen. je. @ Chris zeigt einen Grund warum. Da sind andere.

Das "öffentliche" Schema ist jedoch in keiner Weise speziell . Es ist nur das Standardschema, das in Standarddistributionen vorinstalliert ist, damit wir sofort loslegen können. Einige DB-Administratoren verwenden das "öffentliche" Schema überhaupt nicht, andere löschen es sogar.

CREATE EXTENSION ist nicht mit dem "öffentlichen" Schema verbunden. Es wird in das aktuelle Schema installiert, sofern nicht anders angegeben - außer einige Erweiterungen haben ein voreingestelltes Schema (wie PGQ/Londiste ). Die Dokumentation :

Schemaname

Der Name des Schemas, in dem die Objekte der Erweiterung installiert werden sollen, vorausgesetzt, die Erweiterung ermöglicht das Verschieben des Inhalts. Das benannte Schema muss bereits vorhanden sein. Wenn nicht angegeben und die Steuerdatei der Erweiterung auch kein Schema angibt , wird das aktuelle Standardschema für die Objekterstellung verwendet .

Denken Sie daran, dass die Erweiterung selbst nicht in einem Schema enthalten ist: Erweiterungen haben nicht qualifizierte Namen, die datenbankweit eindeutig sein müssen. Objekte, die zur Erweiterung gehören, können sich jedoch in Schemas befinden.

Meine kühne Betonung.
Entscheiden Sie, wie Benutzer, Schemas und search_path verwaltet werden sollen:

Dann Entscheiden Sie, wo Erweiterungen installiert werden sollen. Sie können in ein beliebiges Schema Ihrer Wahl installieren und dieses Schema in den Standardwert search_path Für alle Benutzer oder nur für einige oder gar keine Benutzer aufnehmen (sodass qualifizierte Referenzen erforderlich sind). Es hängt alles davon ab, was Sie erreichen möchten.
Was auch immer Sie tun, bleiben Sie konsequent.

Ich installiere gerne Erweiterungen (die es erlauben) in einem dedizierten "Erweiterungs" -Schema, das ich in das Standardschema search_path after "public" (und "$ user" - einbinde. wenn du das benutzt). Hilft bei einer sauberen Trennung meiner eigenen öffentlichen Funktionen und anderer öffentlicher Objekte. Meine Einstellung in postgresql.conf:

search_path = "$user",public,extensions

Oder:

search_path = public,extensions

Und ich installiere Erweiterungen mit:

CREATE EXTENSION some_extension SCHEMA extensions;

Eine Sache zu beachten: Auf diese Weise können Sie (nicht qualifizierte) Objekte im extensions - Schema hinter Objekten mit demselben Namen (und Parametern) im public - Schema "verstecken".

Verbunden:

16

Installieren von Erweiterungen in pg_catalog werden meines Wissens nicht empfohlen. Sie sollten das Standardschema public verwenden, das sich auch im search_path standardmäßig.

Warum?

Als Beispiel werde ich mit der Erweiterung pageinspect arbeiten, die ich bereits im Schema public erstellt habe. Alle Funktionen sind standardmäßig für alle Schemas in der Datenbank zugänglich, wenn sie sich im Schema public befinden.

Jetzt versuche ich es auf das pg_catalog Schema mit

ALTER EXTENSION pageinspect SET SCHEMA pg_catalog;

und es funktioniert gut.

Aber...

Versuchen Sie erneut, es mit dem Schema public zu verschieben

ALTER EXTENSION pageinspect SET SCHEMA public;

und es wird es nicht zulassen, was den folgenden Fehler ergibt

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

Oh oh! Nun, das ist in Ordnung, dass ich es nicht bewegen kann. Ich kann es einfach wieder in das public - Schema einfügen, indem ich es lösche und neu erstelle, oder? ...

DROP EXTENSION pageinspect;
CREATE EXTENSION pageinspect;

OK gut. Zurück an der richtigen Stelle im Schema public, und die Funktionen sind weiterhin für alle Schemas in der Datenbank zugänglich.

TL, DR; Verwenden Sie einfach das Standardschema public für Erweiterungen.

6
Chris