[pgsql-jp: 36775] Re: 他DB、他サーバDBへの変更前、変更後のレコード保存

Kiyoshi Mizuno kiyoshi_mizuno @ mail.toyota.co.jp
2006年 2月 27日 (月) 12:40:18 JST


水野です。

> -----Original Message-----
> DB上の任意テーブルにコンソールなどから操作(UPDATE,DELETE)
> 行った際に、変更前、変更後のレコード情報を、同一サーバ上の他
> DB、もしくは、他サーバ上のDBへ保存しようと考えております。
> 
> # 上記処理をPL/pgSQLを使用、もしくは他の方法にて実現すること
> # は可能でしょうか?

私の個人的な見解ですが・・・

同一DB内への記録であれば松風さんも自身で調査して御存知の
通り、Triggerを使って(トランザクションが絡んでくると
多少話がややこしくなるでしょうが)特に問題なく実現可能だと
思います。

しかし相手が別DBとなると話は別で、上記のような事を実現
するにはトリガの中で別DBへコネクトする必要が出てきます。
別DBへのコネクションを作成する機能がPL/pgSQLネイティブに
実装されているのか、別途C言語などで書く必要があるのかは
不勉強ゆえ私は分かりませんが、出来たとするとトリガ関数が
呼ばれる度に他DBへコネクト+ディスコネクトする事になります。
これは相当のパフォーマンス低下を招くと思われます。
(外部プログラムでコネクションプーリングしてやるなど
 すればパフォーマンス面は改善できるかもしれません)

また別DBとデータ連携させる際には”DB接続失敗時の
エラーリカバリをどうするか”という問題が無視できなく
なってきます。
この場合の選択肢としては
1.エラーの時は記録するのを諦める。
2.(トリガ関数の中で)成功するまでリトライする。
3.一時的にローカルのテーブルに書き出しておいて
  次に呼ばれた時リトライする。
というのがありますが、”変更前後のデータを記録したい”
という希望からして今回の場合まず1案はないでしょう。
2案も「それってシステム設計としてどうよ?」な案です。
また3案では結果的に自DB内に保存するのと大して
変わりません。
そのため「トリガを使って変更履歴を他DBへ記録する」
のは技術的には実現可能でも、努力の割に報われないと
思います。

他DBへの変更履歴記録であれば
(1)トリガでは同一DB内のテーブルに変更前、変更後の
  レコード情報を記録する。
(2)PostgreSQLから独立した外部アプリケーション、
  あるいはレプリケータで(1)のテーブルから他DBに
  データを移動する。
のが実用的な解ではないかと思います。




pgsql-jp メーリングリストの案内