Was ist der Suchpfad für eine bestimmte Datenbank und einen bestimmten Benutzer?

43

Ich kann die Strömung sehen search_pathmit:

show search_path ;

Und ich kann das search_pathfür die aktuelle Session einstellen mit:

set search_path = "$user", public, postgis;

Ebenso kann ich die search_pathfür eine gegebene Datenbank dauerhaft einstellen mit:

alter database mydb set search_path = "$user", public, postgis ;

Und ich kann die search_pathfür eine bestimmte Rolle (Benutzer) dauerhaft einstellen mit:

alter role johnny set search_path = "$user", public, postgis ;

Aber ich würde gerne wissen , wie Sie feststellen können, was die Datenbank und Rolle Einstellungen sind (bezüglich search_path) vor , sie zu verändern?

user664833
quelle

Antworten:

36

Konfigurationseinstellungen für Rollen und Datenbanken finden Sie in der Katalogtabelle pg_db_role_setting.

Diese Abfrage ruft alle Einstellungen für eine bestimmte Rolle oder Datenbank ab:

SELECT r.rolname, d.datname, rs.setconfig
FROM   pg_db_role_setting rs
LEFT   JOIN pg_roles      r ON r.oid = rs.setrole
LEFT   JOIN pg_database   d ON d.oid = rs.setdatabase
WHERE  r.rolname = 'myrole' OR d.datname = 'mydb';

Wenn nichts festgelegt ist, bestimmt die nächstniedrigere Instanz den Standardstatus von search_path( postgresql.confin diesem Fall oder Befehlszeilenoptionen beim Serverstart). Verbunden:

Um unset alle Einstellungen einer Rolle oder einer Datenbank - die search_pathin diesem Beispiel:

ALTER ROLE myrole RESET search_path;

Oder:

ALTER DATABASE mydb RESET search_path;

Oder:

ALTER ROLE myrole in DATABASE mydb RESET search_path;

Bearbeiten Sie niemals Daten im Systemkatalog ( pg_catalog.*) manuell. Verwenden Sie DDL-Befehle gemäß den Anweisungen im Handbuch für ALTER ROLEund ALTER DATABASE.
Im Wesentlichen RESETlöscht der Befehl eine Zeile, pg_db_role_settingdamit die Basiseinstellung wieder wirksam wird. Ich würde das nicht verworren nennen.

Erwin Brandstetter
quelle
Beeindruckend. Ich hätte nicht gedacht, dass es so verworren sein würde. Wie würden Sie unset eine gegebene Datenbank und Rolle Einstellung? Nach dem Ausführen habe alter role myrole set search_path = "$user", public, postgis ;ich gemerkt, dass pg_roles.rolconfig(entsprechend meiner Rolle) der Wert erhalten hat {"search_path=\"$user\", public, postgis"}. Außerdem wird select * from pg_db_role_setting ;jetzt eine zusätzliche Zeile angezeigt. Und nach dem Ausführen alter database mydb set search_path = "$user", public, postgis ;sehe ich eine entsprechende Zeile in select * from pg_db_role_setting ;- am Ende bin ich mir nicht sicher, wie ich diese Änderungen "rückgängig machen" soll.
user664833
@ user664833: Ich habe Anweisungen zu unset hinzugefügt.
Erwin Brandstetter
6

Die permanenten Einstellungen für Datenbanken und Rollen werden in der clusterweiten Systemtabelle pg_db_role_settings gespeichert .

Es sind nur geänderte Einstellungen vorhanden. Wenn der Suchpfad für eine Datenbank oder eine Rolle nie geändert wurde, kann dies vermutlich angenommen werden "$user",public.

  • Der Wert der Einstellung vor jeder Änderung, auch auf Clusterebene (über die globale Konfiguration postgresql.conf), kann aus der Datenbank abgefragt werden mit:

     SELECT boot_val FROM pg_settings WHERE name='search_path';
  • Der Wert der Einstellung vor jeder Änderung innerhalb der Sitzung (über den SETBefehl) kann aus der Datenbank abgefragt werden mit:

     SELECT reset_val FROM pg_settings WHERE name='search_path';
  • Wenn ein nicht standardmäßiger Wert in festgelegt ist postgresql.conf, ist es nicht einfach, diesen Wert in SQL unabhängig von der aktuellen Sitzung abzurufen . pg_settings.boot_valDies ist nicht der Fall, da Änderungen in der Konfigurationsdatei ignoriert werden und pg_settings.reset_valauch nicht, da sie von den möglicherweise durch festgelegten Datenbank- / Benutzereinstellungen beeinflusst werden ALTER USER/ALTER DATABASE. Der einfachste Weg für einen DBA, den Wert zu ermitteln, besteht darin, ihn nur nachzuschlagen postgresql.conf. Andernfalls lesen Sie Zurücksetzen von search_path auf den globalen Clusterstandard, in dem dieses Thema ausführlich behandelt wird.

Daniel Vérité
quelle
Ist das nicht boot_valeigentlich die kompilierte Werkseinstellung, nicht die Einstellung in postgresql.conf?
Erwin Brandstetter
@ Erwin: ja. Man könnte sich reset_valstattdessen anschauen wollen boot_val.
Daniel Vérité
Hmm, Datenbank- oder Rolleneinstellungen überschreiben den Wert in reset_val. Ich bin über diese alte Frage gestolpert, als ich diese letzte recherchierte: dba.stackexchange.com/questions/145280/…
Erwin Brandstetter
@Erwin: ISTM, dass das Abrufen des Werts von postgresql.conf in den meisten Fällen ein XY-Problem ist. Wie auch immer, ich habe die Antwort bearbeitet, um auf die neuere Frage zu verlinken und etwas zu erweitern.
Daniel Vérité
3
select * from pg_user;

Richtig für Postgres und Redshift. Dies scheint im Vergleich zu den vorherigen abhängigen Antworten zu einfach pg_db_role_setting, aber die useconfigSpalte enthält eine Liste der Benutzerkonfigurationen, einschließlich der search_pathals Liste formatierten.

Die Dokumentation zu pg_user Postgres finden Sie hier

Um selektiver zu sein:

rs.db.batarang.com cooldb:cooldude =#> select usename
                                              , useconfig 
                                       from   pg_user
                                       where  usename = 'cooldude';
┌────────────┬─────────────────────────────────────────────────────┐
  usename                         useconfig                      
├────────────┼─────────────────────────────────────────────────────┤
 cooldude    {"search_path=dirt, test, \"$user\", public, prod"} 
└────────────┴─────────────────────────────────────────────────────┘

Ich denke, diese Benutzertabelle enthält alle Benutzer im Cluster, nicht nur eine bestimmte Datenbank - aber ich habe das nicht überprüft.

Merlin
quelle
Die Rolle ist nicht mit der des Benutzers identisch. ;)
Vic
Vic, könntest du das näher erläutern? Die Postgres-Dokumente sind prägnant und scheinen zu sagen, dass Benutzer und Rolle keine unterschiedlichen Konzepte mehr sind, aber ich bin kein Datenbankadministrator und würde gerne mehr Eingaben machen. postgresql.org/docs/current/static/user-manag.html
Merlin
2
Jede 'Rolle' kann als Benutzer, Gruppe oder beides fungieren. Ein Benutzer muss jedoch eine andere Unterscheidung treffen. Beim Überprüfen des Katalogs sehen wir, dass die Ansichten pg_role und pg_user beide auf die Tabelle pg_authid verweisen, jedoch mit dem Prädikat rolcanlogin für Benutzer. Benutzer können sich bei Ihrer Datenbank anmelden und im Allgemeinen definieren Rollen Berechtigungssätze, die Benutzer erben.
Vic