Postgresでは、現在定義されているセーブポイントのリストを取得する方法は?


13

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

より正確に言うと、どの名前が接続で「no such savepoint」エラーを引き起こさないかを確認したいと思います。

回答:


8

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

長い答え:定義済みのセーブポイントのリストを取得する既存の方法はないようです。さらに悪いことに、あなたがこれをやらせるだろうPostgreSQLの拡張を作成することはできていないようだ。見てのsrc /バックエンド/アクセス/のTransAM / xact.c、あなたはどこノーように」ということであるRollbackToSavepoint(のようなその機能を見ることができます「savepoint」エラーメッセージは、xact.cに対して静的であると宣言されている変数CurrentTransactionStateに依存しています。つまり、拡張コードに対してグローバルに表示されません。

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

この機能が欠落している理由については、サーバーから定義済みのセーブポイントのリストを取得する必要があるクライアントにとって、もっともらしいユースケースはないと推測します。クライアントはこのリストで何をしますROLLBACKか?ランダムに1つを選んでください。ROLLBACK盲目的に最後まで?AFAICTセーブポイントは、クライアントが定義したセーブポイントとそれらを使用できる場所を覚えている場合にのみ役立ちます。


この答えをありがとう。クライアントはもちろん覚えておく必要がありますが、1つの接続への複雑なマルチスレッドアクセスの場合、これはクライアントコードのデバッグに役立ちます。多くの場合、アクセス可能な情報が多いほど、少ないIMHOよりも優れています。
vaab 14

はい、コードを実行するためには意味がありません。ただし、デバッグする場合は、どのセーブポイントが開いているかを確認すると役立ちます。ご回答ありがとうございます。
ゲットリ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.