2009-07-29 17 views
0

Wie liest du die folgende Codezeile? Der Code stammt von SO von John Saunders. (Bitte einen Link, um es, wenn Sie es finden)Um eine Aussage in Postgres zu verstehen

SET search_path TO so,"$user", public; 

Kontext

START TRANSACTION ISOLATION LEVEL SERIALIZABLE, READ WRITE; 
CREATE SCHEMA SO 
SET search_path TO so,"$user", public;  /// here 
... 

ich die Zeile lesen als "gewählten Pfad zu Ihrem Schema für einen bestimmten Benutzer eingestellt öffentlich ". Öffentlich scheint zu bedeuten, dass der PATH oder Benutzer öffentlich ist. Ich bin nicht sicher, warum wir den variablen Benutzer quota müssen, da alles Kleinbuchstaben ist.

+0

Vielen Dank für Ihre Antworten! –

Antwort

2

Das Festlegen des Suchpfads ist sehr häufig, wenn Sie eine Datenbank mit genügend Tabellen haben, die in mehrere Schemas aufgeteilt wurden. Der Weg zu verstehen, was es tut und verwendet wird, ist mit der schema Dokumentation zu beginnen, die die Rolle des öffentlichen Schemas auch in Sachen abdeckt.

Die Art und Weise $ Benutzer ersetzt wird, wenn es erscheint in diesem Pfad in der Dokumentation für search_path beschrieben:

„Wenn eine des Listenelementes ist die besonderer Wert $ user, dann das Schema mit Der von zurückgegebene Name SESSION_USER wird ersetzt, wenn ein solches Schema ist.

Offensichtlich ist Ihre nächste Frage dann, was ist SESSION_USER? Dies beginnt als der Benutzername, den Sie mit der Datenbank verbinden, aber kann sich über Befehle wie SET SESSION AUTHORIZATION ändern. Die Idee ist, dass es Ihnen helfen kann, ein Schema für jeden Benutzer einzurichten, was eine nützliche Möglichkeit sein kann, die Sicherheit für jeden Benutzer zu sperren. Ich habe nur davon gehört, dass es in einer einfachen Datenbank verwendet wird, die eine Art Umgebung hostet, in der jeder Benutzer seine eigene Rolle und sein eigenes Schema erhält, aber nicht seine eigene Datenbank. Sie können den "$ user" -Teil wahrscheinlich dort lassen und nichts beeinflussen, er wird standardmäßig angezeigt und die meisten wissen nicht, dass Sie ihn entfernen können, wenn Sie sich nicht darauf verlassen.

$ Benutzer ist in Anführungszeichen, weil das eine reserved word im SQL-Standard ist. Sie können Dinge mit reservierten Wörtern benennen, wenn Sie in PostgreSQL müssen, auch wenn es eine schlechte Idee ist, aber Sie müssen sie ständig in Anführungszeichen setzen, damit der SQL-Parser sie nicht falsch interpretiert. Dies kann Sie mit seltsamen Fehlern verletzen, wenn Sie versuchen, ein reserviertes Wort als den Namen einer Spalte oder Tabelle zu verwenden.Einige könnten Sie versehentlich versuchen, als Spaltennamen zusätzlich zu "Benutzer" zu verwenden, da sie sich auf gängige Dinge aus der Praxis beziehen, darunter case, default, end, full, left, new, offset, order und references.

2

Sie legt die Reihenfolge der Schemasuche der aktuellen Datenbankverbindung fest, wenn eine SQL-Anweisung ohne explizite Schema-Notation dargestellt wird.

In diesem Fall durchsucht die Datenbankabfrage-Engine zuerst das Schema "so", dann ein Schema mit demselben Namen wie die aktuelle Datenbankverbindung, schließlich ein Schema mit dem Namen public. Ich nehme an, die Zitate sind wegen des Dollarzeichens.

1

Die PostgreSQL-Dokumentation für die Option search_path enthält eine gute Beschreibung ihres Zwecks.

Dies ist wahrscheinlich ein seltener Befehl, weil der Standard fast immer genau das ist, was Sie wollen. Ich habe es nie in irgendeiner PostgreSQL-Arbeit verwendet, die ich gemacht habe.

+0

Sie könnten an Gregs Antwort interessiert sein. Er erklärt gut search_path und seine Anwendungen. –

Verwandte Themen