Apakah ada cara untuk mengakses tabel sementara dari sesi lain di postgres?

17

Saya bekerja dengan aplikasi Windows yang menggunakan Database postgres (lokal) dan menyimpan beberapa informasi dalam tabel sementara. Saya ingin melihat tabel sementara, tetapi pgadmin dan dbV memberi tahu saya: ERROR: cannot access temporary tables of other sessionsketika mencoba untuk meminta data. Saya mencoba mengubah izin skema dan tabel, tetapi ini tampaknya tidak membantu, meskipun saya mengakses database dengan pengguna yang sama dengan program itu sendiri (setidaknya dalam dbVis). Apakah ada pengaturan yang dapat saya ubah di basis data saya yang memungkinkan saya memiliki akses "root" ke semua sesi di basis data saya?

newenglander
sumber

Jawaban:

14

Kurangnya akses ke tabel sementara di sesi lain bukan masalah izin, ini adalah batasan teknis dari desain. Backend PostgreSQL tidak dapat mengakses tabel sementara dari backend lain karena tidak ada layanan biasa yang memungkinkan akses bersamaan dilakukan untuk tabel sementara.

Di 9.2 Anda akan ingin menggunakan UNLOGGEDtabel sebagai gantinya; ini dapat terlihat dari sesi lain, tetapi mempertahankan sebagian besar manfaat kinerja dari tabel sementara.

Craig Ringer
sumber
11

Jawaban singkatnya adalah "Tidak". Tabel sementara di sesi lain tidak terlihat oleh desain. Tidak ada bedanya jika dua sesi memiliki pengguna yang sama. Bahkan:

Daemon autovacuum tidak dapat mengakses dan karenanya tidak dapat menyedot debu atau menganalisis tabel sementara

Jack Douglas
sumber
Ketika temp tables dijatuhkan, apakah mereka membutuhkan ruang hampa untuk membersihkan semua memori atau sumber daya disk? Saya mencoba untuk menyelesaikan masalah ini dan tidak yakin apakah fakta bahwa autovacuum tidak dapat melihat tabel temp adalah alasan kebocoran memori. Apakah saya perlu menyedot debu secara manual?
poshest
"Ketika tabel temp diturunkan, apakah mereka membutuhkan ruang hampa" tidak, lihat di sini . Hal yang sama berlaku untuk semua tabel, bukan hanya tabel temp.
Jack Douglas
3

Saya tidak tahu apakah ini bisa membantu Anda, tetapi Anda bisa mencobanya.

Kueri tabel katalog sistem berikut ini dapat membuat daftar semua tabel sementara yang dibuat di sesi lain dalam database:

pilih pn.nspname, pc.relname dari pg_class pc, pg_namespace pn di mana pc.relnamespace = pn.oid dan pc.relname ilike 'your_temp_table_name';

Per dokumen PostgreSQL , Temporary tables exist in a special schemadan biasanya dibuat dengan nama sebagai pg_temp_xxx. Jadi, gunakan schemaname. relationnamedari kueri di atas, Anda harus dapat meminta tabel sementara Anda. Seperti yang Anda lihat di sini, tabel sementara direferensikan dengan nama yang memenuhi syarat skema.

Contoh: select * from pg_temp_20.your_temp_table_name

Gnanam
sumber
1
Terima kasih atas tipnya. Saya bisa mengetahui nama dan skema untuk tabel sementara menggunakan dbvis (yang mungkin menggunakan kueri pertama yang Anda sebutkan), tetapi masalahnya adalah saya tidak bisa mengaksesnya dari sesi selain dari yang mereka buat.
newenglander