In Postgres, come ottenere un elenco del punto di salvataggio attualmente definito?


13

Sto usando postgres SAVEPOINT che crea un nuovo punto di salvataggio all'interno della transazione corrente e vorrei visualizzare l'elenco di punti di salvataggio attualmente definiti in una connessione.

Per essere più precisi: mi piacerebbe verificare quale nome NON attiverà l'errore "nessun tale punto di salvataggio" in una connessione.

Risposte:


8

Domanda interessante! Risposta breve: no .

Risposta lunga: non sembra esserci alcun modo esistente per ottenere un elenco di punti di salvataggio definiti. Ancora peggio, non sembra possibile creare un'estensione PostgreSQL che ti consenta di farlo: guardando src / backend / access / transam / xact.c , puoi vedere che funzioni come RollbackToSavepoint (che è dove "no savepoint "il messaggio di errore che hai citato proviene da) si basa sulla variabile CurrentTransactionState, che è dichiarata statica su xact.c, cioè non sarebbe visibile globalmente al codice di estensione.

Ora, se eri audace e alquanto disperato nel generare un elenco di punti di salvataggio definiti dal lato server (invece di far ricordare il tuo client ...), potresti aggiungere una funzione di supporto a xact.c che visualizzerebbe questo informazioni per te. In effetti, ecco una patch del genere . Questa è una patch molto approssimativa a solo scopo illustrativo, ed elimina solo i nomi dei punti di salvataggio, dovrebbe davvero restituire quei nomi come setof text.

Per quanto riguarda il motivo per cui questa funzione non è presente, suppongo che non vi sia semplicemente un caso d'uso plausibile per un client che deve recuperare un elenco di punti di salvataggio definiti dal server. Cosa farebbe il cliente con questo elenco: basta sceglierne uno a caso e ROLLBACKad esso? ROLLBACKall'ultimo alla cieca? I punti di salvataggio AFAICT sono utili solo se un client ricorda quali punti di salvataggio ha definito e dove si trovavano per poterli utilizzare.


Grazie per questa risposta Il client dovrebbe ricordare ovviamente, ma in caso di complicato accesso multi-thread a una connessione, questo sarebbe utile per eseguire il debug del codice client! E più informazioni probabilmente accessibili sono spesso meglio di meno IMHO.
vaab,

Sì, per l'esecuzione del codice non ha senso. Ma per il debug sarebbe utile vedere quali punti di salvataggio sono aperti. La ringrazio per la risposta.
Guettli,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.