Existe-t-il un moyen d'accéder aux tables temporaires d'autres sessions dans PostgreSQL?

17

Je travaille avec une application Windows qui utilise une base de données postgres (locale) et stocke des informations dans une table temporaire. Je voudrais jeter un œil à la table temporaire, mais pgadmin et dbVis me disent: ERROR: cannot access temporary tables of other sessionslorsque vous essayez d'interroger les données. J'ai essayé de changer les autorisations du schéma et de la table, mais cela n'a pas semblé aider, même si j'accède à la base de données avec le même utilisateur que le programme lui-même (au moins dans dbVis). Existe-t-il un paramètre que je peux modifier dans ma base de données qui me permet d'avoir un accès "root" à toutes les sessions de ma base de données?

newenglander
la source

Réponses:

14

Le manque d'accès aux tables temporaires dans les autres sessions n'est pas une question de permissions, c'est une limitation technique de la conception. Un backend PostgreSQL ne peut pas accéder aux tables temporaires d'un autre backend car aucune des tâches de nettoyage habituelles permettant un accès simultané n'est effectuée pour les tables temporaires.

Dans 9.2, vous voudrez utiliser une UNLOGGEDtable à la place; cela peut être visible à partir d'autres sessions, mais conserve la plupart des avantages de performances d'une table temporaire.

Craig Ringer
la source
11

La réponse courte est non". Les tables temporaires des autres sessions sont invisibles de par leur conception. Cela ne fait aucune différence si deux sessions ont le même utilisateur. Même:

Le démon autovacuum ne peut pas accéder et ne peut donc pas vider ou analyser des tables temporaires

Jack Douglas
la source
Lorsque les tables temporaires sont supprimées, ont-elles besoin d'un vide pour nettoyer les ressources de mémoire ou de disque? J'essaie de résoudre ce problème et je ne sais pas si ce fait que l'autovacuum ne peut pas voir les tables temporaires est la raison de la fuite de mémoire. Dois-je passer l'aspirateur manuellement?
Poshest
"Lorsque les tables temporaires sont supprimées, ont-elles besoin d'un vide" non, voir ici . Il en va de même pour toutes les tables, pas seulement pour les tables temporaires.
Jack Douglas
3

Je ne sais pas si cela peut vous aider, mais vous pouvez essayer.

La requête de table de catalogue système suivante doit pouvoir répertorier toutes les tables temporaires créées dans d'autres sessions de la base de données:

sélectionnez pn.nspname, pc.relname dans pg_class pc, pg_namespace pn où pc.relnamespace = pn.oid et pc.relname ilike 'your_temp_table_name';

Par doc PostgreSQL , Temporary tables exist in a special schemaet sont généralement créés avec le nom as pg_temp_xxx. Donc, en utilisant schemaname. relationnameà partir de la requête ci-dessus, vous devriez pouvoir interroger votre table temporaire. Comme vous pouvez le voir ici, la table temporaire est référencée avec un nom qualifié de schéma.

Exemple: select * from pg_temp_20.your_temp_table_name

Gnanam
la source
1
Merci pour le conseil. J'ai pu trouver le nom et le schéma de la table temporaire à l'aide de dbvis (qui utilise probablement la première requête que vous avez mentionnée), mais le problème était que je ne pouvais pas y accéder à partir d'une session autre que celle dans laquelle ils avaient été créés.
newenglander