Wie erhält man in Postgres eine Liste der aktuell definierten Sicherungspunkte?

13

Ich verwende postgres SAVEPOINT, das einen neuen Sicherungspunkt innerhalb der aktuellen Transaktion erstellt und die Liste der aktuell definierten Sicherungspunkte in einer Verbindung anzeigen möchte.

Genauer gesagt: Ich möchte überprüfen, welcher Name NICHT den Fehler "no such savepoint" in einer Verbindung auslösen würde.

vaab
quelle

Antworten:

8

Interessante Frage! Kurze Antwort: nein .

Lange Antwort: Es scheint keine Möglichkeit zu geben, eine Liste von Sicherungspunkten zu definieren. Schlimmer noch, es scheint nicht möglich zu sein, eine PostgreSQL - Erweiterung zu erstellen, mit der Sie dies tun könnten: Wenn Sie sich src / backend / access / transam / xact.c ansehen , können Sie feststellen, dass Funktionen wie RollbackToSavepoint (in denen "no such" vorkommen) Die Fehlermeldung "savepoint", von der Sie gesprochen haben, ist auf die Variable CurrentTransactionState angewiesen, die für xact.c als statisch deklariert ist, dh für den Erweiterungscode nicht global sichtbar wäre.

Wenn Sie es wagen und verzweifelt sind, eine Liste definierter Sicherungspunkte vom Server aus zu generieren (anstatt sich nur an Ihren Client zu erinnern ...), können Sie xact.c eine Hilfsfunktion hinzufügen, die dies anzeigt Informationen für Sie. In der Tat ist hier nur ein solcher Patch . Dies ist nur zu Illustrationszwecken ein sehr grober Patch, der nur die Savepoint-Namen außer Acht lässt. Er sollte diese Namen wirklich als Textsatz zurückgeben.

Ich vermute, dass es keinen plausiblen Anwendungsfall für einen Client gibt, der eine Liste definierter Sicherungspunkte vom Server abrufen muss. Was würde der Kunde mit dieser Liste machen - einfach eine zufällig auswählen und ROLLBACKdazu? ROLLBACKblind bis zum letzten? AFAICT-Sicherungspunkte sind nur nützlich, wenn sich ein Client merkt, welche Sicherungspunkte er definiert hat und wo sie sich befanden, um sie verwenden zu können.

Josh Kupershmidt
quelle
Danke für diese Antwort. Der Client sollte sich natürlich daran erinnern, aber im Falle eines komplizierten Multithread-Zugriffs auf eine Verbindung wäre dies hilfreich, um den Client-Code zu debuggen! Und mehr Informationen, auf die möglicherweise zugegriffen werden kann, sind oft besser als weniger.
Vaab
Ja, für das Ausführen von Code macht es keinen Sinn. Für das Debuggen wäre es jedoch hilfreich zu sehen, welche Sicherungspunkte geöffnet sind. Vielen Dank für Ihre Antwort.
guettli