it-swarm.dev

Czy istnieje sposób na dostęp do tymczasowych tabel innych sesji w postgresie?

Pracuję z aplikacją Windows, która korzysta z (lokalnej) bazy danych postgres i przechowuje pewne informacje w tabeli tymczasowej. Chciałbym rzucić okiem na tabelę tymczasową, ale pgadmin i dbVis mówią mi: ERROR: cannot access temporary tables of other sessions podczas próby zapytania danych. Próbowałem zmienić uprawnienia do schematu i tabeli, ale nie wydawało się to pomocne, mimo że uzyskuję dostęp do bazy danych z tym samym użytkownikiem co sam program (przynajmniej w dbVis). Czy istnieje ustawienie, które mogę zmienić w mojej bazie danych, co pozwala mi mieć dostęp „root” do wszystkich sesji w mojej bazie danych?

19
newenglander

Brak dostępu do tabel tymczasowych w innych sesjach nie jest kwestią uprawnień, jest technicznym ograniczeniem projektu. Zaplecze PostgreSQL nie może uzyskać dostęp do tabel tymczasowych innego zaplecza, ponieważ nie jest wykonywane żadne zwykłe sprzątanie w celu umożliwienia równoczesnego dostępu do tabel tymczasowych.

W 9.2 będziesz chciał zamiast tego użyć tabeli UNLOGGED; może to być widoczne z innych sesji, ale zachowuje większość zalet wydajności tabeli tymczasowej.

15
Craig Ringer

Krótka odpowiedź brzmi „nie”. tabele tymczasowe w innych sesjach są niewidoczne zgodnie z projektem. Nie ma znaczenia, czy dwie sesje mają tego samego użytkownika. Parzysty:

Demon autovacuum nie ma dostępu i dlatego nie może odkurzać ani analizować tabel tymczasowych

Nie wiem, czy to może ci pomóc, ale możesz spróbować.

Poniższa kwerenda tabeli katalogu systemowego powinna zawierać listę wszystkich tabel tymczasowych utworzonych podczas innych sesji w bazie danych:

wybierz pn.nspname, pc.relname z pg_class pc, pg_namespace pn gdzie pc.relnamespace = pn.oid i pc.relname podobnie jak „twoja_temp_tabela_tabela”;

Według PostgreSQL doc , Temporary tables exist in a special schema i zwykle są tworzone pod nazwą pg_temp_xxx. Tak więc, używając schemaname.relationname z powyższego zapytania, powinieneś mieć możliwość zapytania do tabeli tymczasowej. Jak widać tutaj, do tabeli tymczasowej odwołuje się nazwa kwalifikowana do schematu.

Przykład: select * from pg_temp_20.your_temp_table_name

3
Gnanam