C'è un modo per accedere alle tabelle temporanee di altre sessioni in Postgres?


17

Sto lavorando con un'applicazione Windows che utilizza un database Postgres (locale) e memorizza alcune informazioni in una tabella temporanea. Vorrei dare un'occhiata alla tabella temporanea, ma pgadmin e dbVis mi dicono: ERROR: cannot access temporary tables of other sessionsquando si tenta di interrogare i dati. Ho provato a modificare le autorizzazioni dello schema e della tabella, ma questo non sembra essere d'aiuto, anche se accedo al database con lo stesso utente del programma stesso (almeno in dbVis). Esiste un'impostazione che posso modificare nel mio database che mi consente di avere accesso "root" a tutte le sessioni del mio database?

Risposte:


14

La mancanza di accesso a tabelle temporanee in altre sessioni non è una questione di autorizzazioni, è una limitazione tecnica del progetto. Un backend PostgreSQL non può accedere alle tabelle temporanee di un altro backend perché nessuna delle normali operazioni di pulizia per consentire l'accesso simultaneo viene eseguita per le tabelle temporanee.

In 9.2 invece dovrai usare una UNLOGGEDtabella; questo può essere visibile da altre sessioni, ma conserva la maggior parte dei vantaggi in termini di prestazioni di una tabella temporanea.


11

La risposta breve è "No". Le tabelle temporanee in altre sessioni sono invisibili in base alla progettazione. Non fa differenza se due sessioni hanno lo stesso utente. Anche:

Il demone autovacuum non può accedere e quindi non può aspirare o analizzare tabelle temporanee


Quando le tabelle temporanee vengono eliminate, hanno bisogno di un vuoto per ripulire la memoria o le risorse del disco? Sto cercando di risolvere questo problema e non sono sicuro che questo motivo per cui autovacuum non è in grado di vedere le tabelle temporanee sia il motivo della perdita di memoria. Devo aspirare manualmente?
più elegante il

"Quando le tabelle temporanee vengono eliminate, hanno bisogno di un vuoto" no, vedi qui . Lo stesso vale per qualsiasi tabella, non solo per le tabelle temporanee.
Jack Douglas,

3

Non so se questo può aiutarti, ma puoi provare.

La seguente query sulla tabella del catalogo di sistema dovrebbe essere in grado di elencare tutte le tabelle temporanee create in altre sessioni nel database:

selezionare pn.nspname, pc.relname da pg_class pc, pg_namespace pn dove pc.relnamespace = pn.oid e pc.relname come 'your_temp_table_name';

Per PostgreSQL doc , Temporary tables exist in a special schemae di solito sono creati con nome pg_temp_xxx. Quindi, usando schemaname. relationnamedalla query sopra, dovresti essere in grado di interrogare la tua tabella temporanea. Come puoi vedere qui, la tabella temporanea è referenziata con un nome qualificato da schema.

Esempio: select * from pg_temp_20.your_temp_table_name


1
Grazie per il consiglio. Sono stato in grado di scoprire il nome e lo schema della tabella temporanea usando dbvis (che probabilmente utilizza la prima query che hai menzionato), ma il problema era che non potevo accedervi da una sessione diversa da quella in cui erano stati creati.
newenglander
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.