it-swarm.it

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

Sto lavorando con un'applicazione Windows che utilizza un database Postgres (locale) e memorizza alcune informazioni in una tabella temporanea. Vorrei dare un'occhiata al tavolo temporaneo, ma pgadmin e dbVis mi dicono: ERROR: cannot access temporary tables of other sessions quando si tenta di eseguire una query sui 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?

19
newenglander

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

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

15
Craig Ringer

La risposta breve è "No". 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

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 schema e di solito vengono creati con il nome come pg_temp_xxx. Quindi, usando schemaname.relationname dalla query precedente, 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

3
Gnanam