web-dev-qa-db-ja.com

Postgresで、現在定義されているセーブポイントのリストを取得するにはどうすればよいですか?

現在のトランザクション内に新しいセーブポイントを作成するpostgres [〜#〜] savepoint [〜#〜] を使用しており、接続で現在定義されているセーブポイントのリストを表示したいと考えています。

より正確に言うと、接続で「no such savepoint」エラーをトリガーしない名前を確認したいと思います。

13
vaab

興味深い質問です!短い答え:no

長い答え:定義されているセーブポイントのリストを取得する既存の方法はないようです。さらに悪いことに、これを可能にするPostgreSQL拡張機能を作成することは不可能に思われます。 src/backend/access/transam/xact.c を見ると、RollbackToSavepoint(これは、あなたが言及した「そのようなセーブポイントがない」エラーメッセージが由来する場所です)変数CurrentTransactionStateに依存します。これは、xact.cに対して静的に宣言されています。つまり、拡張コードからグローバルに表示されません。

さて、サーバー側から定義されたセーブポイントのリストを生成するのが大胆で、絶望的だった場合(クライアントに記憶させるだけではなく...)、これを表示するヘルパー関数をxact.cに追加できます。あなたのための情報。実際、これはそのような patch です。これは、説明のみを目的とした非常に大まかなパッチであり、セーブポイント名を記録するだけで、実際にはそれらの名前をsetofテキストとして返します。

この機能が欠落している理由については、サーバーから定義済みのセーブポイントのリストをフェッチする必要があるクライアントにとって、もっともらしい使用例はないと思います。クライアントはこのリストをどのように処理しますか?ランダムに1つ選択し、ROLLBACKを選択しますか? ROLLBACK最後まで盲目的に? AFAICTセーブポイントが役立つのは、クライアントが定義したセーブポイントとそれらを使用できるようにするためにそれらがどこにあったかをクライアントが覚えている場合のみです。

8