Gibt es eine Möglichkeit, auf temporäre Tabellen anderer Sitzungen in postgres zuzugreifen?

17

Ich arbeite mit einer Windows-Anwendung, die eine (lokale) Postgres-Datenbank verwendet und einige Informationen in einer temporären Tabelle speichert. Ich würde gerne einen Blick auf die temporäre Tabelle werfen, aber pgadmin und dbVis sagen mir: ERROR: cannot access temporary tables of other sessionsbeim Versuch, die Daten abzufragen. Ich habe versucht, die Berechtigungen des Schemas und der Tabelle zu ändern, aber das schien nicht zu helfen, obwohl ich auf die Datenbank mit demselben Benutzer wie das Programm selbst zugreife (zumindest in dbVis). Gibt es eine Einstellung, die ich in meiner Datenbank ändern kann, um "root" -Zugriff auf alle Sitzungen in meiner Datenbank zu haben?

Newenglander
quelle

Antworten:

14

Der fehlende Zugriff auf temporäre Tabellen in anderen Sitzungen ist keine Berechtigungssache, sondern eine technische Einschränkung des Designs. Ein PostgreSQL-Backend kann nicht auf temporäre Tabellen eines anderen Backends zugreifen, da für temporäre Tabellen keine der üblichen Verwaltungsaufgaben ausgeführt wird, um den gleichzeitigen Zugriff zu ermöglichen.

In 9.2 möchten Sie UNLOGGEDstattdessen eine Tabelle verwenden. Dies kann in anderen Sitzungen sichtbar sein, behält jedoch die meisten Leistungsvorteile einer temporären Tabelle bei.

Craig Ringer
quelle
11

Die kurze Antwort lautet "Nein". Temporäre Tabellen in anderen Sitzungen sind von Entwurf unsichtbar . Es macht keinen Unterschied, ob zwei Sitzungen denselben Benutzer haben. Sogar:

Der Autovacuum-Daemon kann nicht auf temporäre Tabellen zugreifen und diese daher nicht vakuumieren oder analysieren

Jack Douglas
quelle
Benötigen temporäre Tabellen ein Vakuum, um Speicher- oder Datenträgerressourcen zu entfernen? Ich versuche, dieses Problem zu beheben und bin mir nicht sicher, ob diese Tatsache, dass Autovacuum keine temporären Tabellen erkennt, der Grund für den Speicherverlust ist. Muss ich manuell staubsaugen?
vornehmsten
"Wenn temporäre Tische fallengelassen werden, brauchen sie ein Vakuum" nein, siehe hier . Gleiches gilt für alle Tabellen, nicht nur für temporäre Tabellen.
Jack Douglas
3

Ich weiß nicht, ob dir das helfen kann, aber du kannst es versuchen.

Die folgende Abfrage der Systemkatalogtabelle sollte in der Lage sein, alle temporären Tabellen aufzulisten, die in anderen Sitzungen in der Datenbank erstellt wurden:

Wählen Sie pn.nspname, pc.relname aus pg_class pc, pg_namespace pn, wobei pc.relnamespace = pn.oid und pc.relname wie 'your_temp_table_name';

Per PostgreSQL- Dokument , Temporary tables exist in a special schemaund werden in der Regel mit dem Namen als erstellt pg_temp_xxx. Also mit schemaname. relationnameVon der obigen Abfrage sollten Sie in der Lage sein, Ihre temporäre Tabelle abzufragen. Wie Sie hier sehen können, wird auf eine temporäre Tabelle mit einem schemaqualifizierten Namen verwiesen.

Beispiel: select * from pg_temp_20.your_temp_table_name

Gnanam
quelle
1
Danke für den Tipp. Ich konnte den Namen und das Schema für die temporäre Tabelle mit dbvis herausfinden (wobei wahrscheinlich die erste von Ihnen erwähnte Abfrage verwendet wird), aber das Problem war, dass ich nicht von einer anderen Sitzung als der, in der sie erstellt wurden, auf sie zugreifen konnte.
Newenglander