web-dev-qa-db-ja.com

PostgreSQLトランザクションで変更されたタプルを表示する方法は?

BEGIN;

   INSERT INTO foo_table(foo_column) VALUES('a'),('b'),('c');

   -- SELECT * FROM pg_stat_activity WHERE ...
   -- shows records with a flag if they have been added/deleted/updated

END;

PostgreSQL 9.xの特定のテーブルのトランザクションのコミットされていない挿入/削除を表示する方法はありますか?これは純粋に視覚的な確認のためです。

私の最初の考えはノー(テーブルのSQL-Selectを実行するだけ)ですが、特定のユーザーはトランザクション内の違いを視覚化したいと考えました。多くのセーブポイントとトランザクションがある場合、これがどのように役立つかがわかりました。したがって、コミュニティ全体に尋ねる価値はありました。

4
vol7ron

内部 xmin を調べて、新しく挿入された行バージョンを特定できます(注、UPDATEの結果も含まれます)。

_SELECT * FROM foo_table
WHERE  xmin::text = (txid_current() % (2^32)::bigint)::text;
_

どうして?

関数 txid_current() は、現在のトランザクションIDを返します。ただし、xminの内部トランザクションIDタイプは32ビット幅で、40億トランザクションごとにラップされますが、txid_current()bigint数量を返します ドキュメントごとに:

これは「エポック」カウンターで拡張されているため、インストールの存続期間中にラップアラウンドしません。

Tom Laneが議論しているpgsql-hackersのスレッドです
私はそこから安全なWHERE状態を導き出しました。

コメントへの対処:同じトランザクションで削除された削除済み行は常にどちらの方法でも表示されないため、結果には含まれません。

免責事項

ただし、これは SAVEPOINT (またはいくつかで始まるサブトランザクションでは機能しません他の方法では、 plpythonはサブトランザクションを使用できます も)。これらは個別のxidを生成し、現在txid_current()によって返される最上位トランザクションに属するxidの完全なリストを取得する方法はありません。解決策を検索したところ、pgsql-hackersでこの密接に関連するスレッドが見つかりました。

現在、この制限を回避するための信頼できるソリューションは見当たりません。

関連:

7