PostgreSQL-Schemas und Suchpfad

7

Ich lese Oreillys PostgreSQL: Up and Running und im Abschnitt Organisieren Ihrer Datenbank mithilfe von Schemas heißt es, dass search_pathdies auf Datenbankebene festgelegt werden kann:

Wenn beispielsweise alle Objekte in Contrib ohne Schemaqualifizierung zugänglich sein sollen, ändern wir unsere Datenbank wie folgt:

ALTER DATABASE mydb SET search_path="$user",public,contrib;

Nachdem ich den obigen Befehl eingegeben habe, kann ich jedoch immer noch nicht auf Tabellen in anderen Schemas verweisen, publicohne sie zu qualifizieren:

ALTER DATABASE auth SET search_path="$user",public,staging;`
\d users

Gibt:

Did not find any relation named "users".

Aber wenn ich benutze \d staging.users, funktioniert es.

SHOW search_path;

Gibt:

   search_path   
----------------
 "$user",public

Überschreibt die Standardeinstellung search_pathvon postgresql.confden Wert pro Datenbank, mit dem festgelegt wurde ALTER DATABASE ... SET search_path? Wenn dies der Fall ist, wozu dient der Wert pro Datenbank?

Daniel Serodio
quelle
können Sie select * from users?
Jack sagt, versuchen Sie es mit topanswers.xyz
Nein, ich kann nicht, select * from usersaber ich kann select * from staging.users.
Daniel Serodio
4
Haben Sie die Verbindung zu Ihrer Datenbank wiederhergestellt, nachdem Sie einen neuen Standard für die Datenbank festgelegt haben search_path? Haben Sie versucht, nur die search_pathfür Ihre Verbindung einzustellen?
Kgrittn
Ich hatte mich noch nicht wieder verbunden. Das erneute Verbinden von psql hat mein Problem gelöst, danke. Würden Sie eine Antwort schreiben, damit ich sie als akzeptiert markieren kann?
Daniel Serodio
1
@ Daniel, es ist kein Syntaxfehler in MySQL ("vs '). Einfache und doppelte Anführungszeichen werden gleich behandelt (es sei denn, es ist im ANSISQL-Modus eingestellt). (Kommentar hier, da Sie ihn dort nicht sehen würden. Ich werde dies löschen Kommentar später)
ypercubeᵀᴹ

Antworten:

4

Das Zitat aus dem SETzugehörigen Absatz des ALTER DATABASEDokumentationsabschnitts lautet "Immer wenn anschließend eine neue Sitzung in dieser Datenbank gestartet wird, wird der angegebene Wert zum Standardwert der Sitzung". Die Änderungen werden daher nur für neue Sitzungen wirksam. Sie müssen nur die Verbindung wiederherstellen.

Grayhemp
quelle
Ohne erneut eine Verbindung herzustellen, können Sie den Suchpfad in der aktuellen Sitzung (z. B. in Ihrer psql-Sitzung) ändern SET search_path TO "$user",public,contrib;.
Matt