En Postgres, ¿cómo obtener una lista del punto de salvar definido actual?

13

Estoy usando postgres SAVEPOINT que crea un nuevo punto de rescate dentro de la transacción actual, y me gustaría mostrar la lista de puntos de rescate definidos actualmente en una conexión.

Para ser más precisos: me gustaría comprobar qué nombre NO activaría el error "no existe un punto de guardado" en una conexión.

vaab
fuente

Respuestas:

8

¡Interesante pregunta! Respuesta corta: no .

Respuesta larga: no parece haber ninguna forma existente de obtener una lista de puntos de guardado definidos. Peor aún, no parece posible crear una extensión PostgreSQL que le permita hacer esto: mirando src / backend / access / transam / xact.c , puede ver funciones como RollbackToSavepoint (que es donde eso "no existe "mensaje de error de" punto de salvar "que mencionó proviene) confíe en la variable CurrentTransactionState, que se declara estática en xact.c, es decir, no sería visible globalmente para el código de extensión.

Ahora, si fue atrevido y bastante desesperado por generar una lista de puntos de guardado definidos desde el lado del servidor (en lugar de solo recordarle a su cliente ...), podría agregar una función auxiliar a xact.c que mostraría esto Información para usted. De hecho, aquí hay un parche así . Ese es un parche muy áspero solo con fines ilustrativos, y solo elimina los nombres de los puntos de guardado, realmente debería devolver esos nombres como conjunto de texto.

En cuanto a por qué falta esta característica, supongo que simplemente no hay un caso de uso plausible para un cliente que necesita obtener una lista de puntos de guardado definidos del servidor. ¿Qué haría el cliente con esta lista? ¿Solo elegir una al azar ROLLBACK? ROLLBACKhasta el último a ciegas? Los puntos de guardado de AFAICT solo son útiles si un cliente recuerda qué puntos de guardado ha definido y dónde estaban para poder utilizarlos.

Josh Kupershmidt
fuente
Gracias por esta respuesta El cliente debe recordar, por supuesto, pero en el caso de un acceso multiproceso complicado a una conexión, ¡esto sería útil para depurar el código del cliente! Y más información posiblemente accesible es a menudo mejor que menos en mi humilde opinión.
vaab
Sí, para ejecutar código no tiene sentido. Pero para la depuración sería útil ver qué puntos de guardado están abiertos. Gracias por su respuesta.
guettli