¿Hay alguna manera de acceder a tablas temporales de otras sesiones en postgres?


17

Estoy trabajando con una aplicación de Windows que utiliza una base de datos postgres (local) y almacena cierta información en una tabla temporal. Me gustaría echar un vistazo a la tabla temporal, pero pgadmin y dbVis me dicen: ERROR: cannot access temporary tables of other sessionscuando intento consultar los datos. Intenté cambiar los permisos del esquema y la tabla, pero esto no pareció ayudar, a pesar de que estoy accediendo a la base de datos con el mismo usuario que el programa en sí (al menos en dbVis). ¿Hay alguna configuración que pueda cambiar en mi base de datos que me permita tener acceso "root" a todas las sesiones en mi base de datos?

Respuestas:


14

La falta de acceso a tablas temporales en otras sesiones no es una cuestión de permisos, es una limitación técnica del diseño. Un backend PostgreSQL no puede acceder a las tablas temporales de otro backend porque ninguna de las tareas habituales de mantenimiento para permitir el acceso concurrente se realiza para las tablas temporales.

En 9.2 querrás usar una UNLOGGEDtabla en su lugar; Esto puede ser visible desde otras sesiones, pero conserva la mayoría de los beneficios de rendimiento de una tabla temporal.


11

La respuesta corta es no". Las tablas temporales en otras sesiones son invisibles. por diseño. No hay diferencia si dos sesiones tienen el mismo usuario. Incluso:

El demonio de vacío automático no puede acceder y, por lo tanto, no puede aspirar o analizar tablas temporales


Cuando se descartan las tablas temporales, ¿necesitan un vacío para limpiar los recursos de memoria o disco? Estoy tratando de resolver este problema y no estoy seguro de si este hecho de que el vacío automático no puede ver las tablas temporales es la razón de la pérdida de memoria. ¿Necesito aspirar manualmente?
poshest

"Cuando se caen las tablas temporales, ¿necesitan un vacío?" No, ver aquí . Lo mismo es cierto para cualquier tabla, no solo para las tablas temporales.
Jack Douglas

3

No sé si esto puede ayudarte, pero puedes intentarlo.

La siguiente consulta de la tabla del catálogo del sistema debería poder enumerar todas las tablas temporales creadas en otras sesiones en la base de datos:

seleccione pn.nspname, pc.relname de pg_class pc, pg_namespace pn donde pc.relnamespace = pn.oid y pc.relname como 'your_temp_table_name';

Por documento de PostgreSQL , Temporary tables exist in a special schemay generalmente se crean con el nombre como pg_temp_xxx. Entonces, usando schemaname. relationnamedesde la consulta anterior, debería poder consultar su tabla temporal. Como puede ver aquí, se hace referencia a la tabla temporal con un nombre calificado por esquema.

Ejemplo: select * from pg_temp_20.your_temp_table_name


1
Gracias por el consejo. Pude encontrar el nombre y el esquema de la tabla temporal usando dbvis (que probablemente usa la primera consulta que mencionaste), pero el problema era que no podía acceder a ellos desde una sesión distinta de la que se creó.
newenglander
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.