Da Objekte im pg_catalog
Schema implizit in den search_path
( Dokumenten ) enthalten sind, wird empfohlen, Erweiterungen in diesem Schema zu installieren?
Da Objekte im pg_catalog
Schema implizit in den search_path
( Dokumenten ) enthalten sind, wird empfohlen, Erweiterungen in diesem Schema zu installieren?
Antworten:
Installieren Sie keine Erweiterungen für pg_catalog
(es sei denn, dies ist die Standardeinstellung: Nur sehr wenige Erweiterungen sind so konzipiert), da Sie niemals mit dem Systemkatalog herumspielen . @ Chris zeigt einen Grund warum. Da sind andere.
Das "öffentliche" Schema ist jedoch keineswegs etwas Besonderes . 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 Folgendes verwaltet werden sollen search_path
:
Entscheiden Sie dann , wo Erweiterungen installiert werden sollen. Sie können in ein beliebiges Schema Ihrer Wahl installieren und dieses Schema search_path
für alle Benutzer oder nur für einige oder gar keine Benutzer in die Standardeinstellung 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 dies zulassen) in einem dedizierten "Erweiterungs" -Schema, das ich in der Standardeinstellung search_path
nach "public" (und "$ user" - wenn Sie das verwenden) einbinde. 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;
Eines ist zu beachten: Auf diese Weise können Sie (nicht qualifizierte) Objekte im extensions
Schema hinter gleichnamigen Objekten (und Parametern) im public
Schema "verstecken" .
Verbunden:
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
. (Es wird ein Fehler ausgegeben, wenn Sie versuchen, ihn zu ändern.) Ist dies möglicherweise ein Standard für die Installation von prozeduralen Spracherweiterungen für Funktionen?
Das Installieren von Erweiterungen in pg_catalog
wird meines Wissens nicht empfohlen. Sie sollten das Standardschema verwenden public
, das sich ebenfalls im search_path
Standardschema befindet.
Als Beispiel werde ich mit der pageinspect
Erweiterung arbeiten, die ich bereits im public
Schema erstellt habe. Alle Funktionen sind standardmäßig für alle Schemas in der Datenbank zugänglich, wenn sie sich im public
Schema befinden.
Jetzt versuche ich, es mit in das pg_catalog
Schema zu verschieben
ALTER EXTENSION pageinspect SET SCHEMA pg_catalog;
und es funktioniert gut.
Aber...
Versuchen Sie erneut, es mit in das public
Schema 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 aufnehmen, indem ich es ablege und neu erstelle, oder? ...
DROP EXTENSION pageinspect;
CREATE EXTENSION pageinspect;
OK gut. Zurück an der richtigen Stelle im public
Schema, 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.
plpgsql
erweiterung dann irgendwie eine ausnahme von dieser regel? Jede Installation, die ich gesehen habe, hat diese Erweiterung in pg_catalog