sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo enumerar todas las declaraciones preparadas para todas las sesiones activas?

No. AFAIK las declaraciones preparadas son locales para un backend; otros backends simplemente no saben que existen. Necesitaría modificar el servidor para agregar comunicación adicional entre procesos para permitir que un backend pregunte a los demás sobre las declaraciones preparadas.

Los backends inicialmente parecían compartir las mismas pg_prepared_statements almacenamiento de mesa, como:

SELECT relfilenode FROM pg_class WHERE  relname = 'pg_prepared_statements';

devuelve el mismo relfilenode desde diferentes backends. Me sorprendió, ya que pensé que las declaraciones preparadas no tenían presencia en el disco. Si estuvieran en el disco, supongo que podría usar las funciones del módulo pageinspect contrib para leer las tuplas sin procesar o las páginas de la tabla. La visibilidad sería un problema; ¿Cómo sabría qué estaba relacionado con un backend inactivo/terminado y qué era válido?

Intenté eso y encontré que pg_prepared_statements es en realidad una vista:

regress=# SELECT * FROM heap_page_items(get_raw_page('pg_prepared_statements', 1));
ERROR:  cannot get raw page from view "pg_prepared_statements"

específicamente una vista sobre el pg_prepared_statement() función. Así que no hay nada que inspeccionar. Es backend interno.

Esto parece uno de esos "... pero ¿por qué harías eso?" preguntas, que a menudo es una señal de que alguien está preguntando sobre una solución han visualizado su problema real, en lugar de preguntar sobre su problema real.

Entonces:¿Por qué quieres eso? ¿Cuál es el verdadero problema que estás tratando de resolver?