• ベストアンサー

トリガーを使ったリモートDBの更新方法

いつもお世話になっております。 先に質問の内容を言うと、トリガーを使って、別のDBの同一テーブルの登録・更新をすることが可能かどうか?ということです。 現在は、とあるテーブル(以下Aテーブル)を登録・更新した場合、登録データを履歴ログテーブルに入れ、1日に一回決められた時間に履歴ログテーブルをファイルに出力し、別のDBに送った後にログを元に登録するという流れになっている処理があります。 それを、できる限りリアルタイムで更新できないかという話がでてきまして、その手段として質問の内容が可能かどうかということです。 以下の方法を試みましたが、どちらも問題があり、解決できそうにありませんでした。 ・dblinkを使用  ⇒新たにインストールが必要であり、現状の環境でということなので却下。 ・トリガーから呼ばれる関数に、Cのソースからコンパイルされた動的にロードされるオブジェクトを読み込んで、オブジェクト内からリモートDBに接続に行く  ⇒postgreSQLのCのオブジェクトを読み込む関数を作る際に、DB接続関数「PQconnectdb」が未定義とかで認識してくれない。 上記2つ以外にリモートDBに繋ぎにいく手段をご存知の方がいましたら、ぜひともご教授いただきたいと思いますm(_ _)m

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

こんにちは。 当社も同じ様な要望がありまして、現在作成中の方法を挙げます。 基本的に、ネット上で別ドメインにあるRDBMSを更新する物です。 システム概要は、ローカルDBを登録・更新の際にRSS形式のxmlファイル にその内容を書き出します。 その後XML-RPCプロトコルに添ってリモート側のAPIプログラムをキックします。 (ローカルURLとRSSファイルの所在パスをパラメータとして) リモート側では、pingレシーバプログラムが待ち構えています。 パラメータを受け取り、それを元にRSSファイルを取得してそのファイルを検証チェックし不整合がなければDBを更新して更新完了メッセージをRSSファイルへ書き出す。エラーがある場合もRSSファイルへ書き出す。 ネットで流行しているブログやサイトのRSSリーダーの仕組みを応用したまでです。 欠点は、API上の排他制御が厄介かなという感触です。 弊社の場合、言語はjavaで実現中です。 ご参考になれば幸いです。

twin_shu
質問者

お礼

反応遅れました(^^; 貴重な意見ありがとうございます^^ やはりファイルに出力して、それを監視する方法がいいですかね(--; 下にも書いたのですが、トリガーで仮にリモートDBに登録できたとしても、回線不良などのエラーの場合の対処をどうするかなど、色々クリティカルな問題点があるので、ファイル出力⇒監視して取得の方法に話がいきつつある状態です。 ただ、RSSの方法は考えつかなかった(というかやったことなかった)ので、その方法を参考にさせていただきます。 ありがとうございました^^

その他の回答 (1)

  • Dodonpa2
  • ベストアンサー率82% (19/23)
回答No.1

こんにちは。 >⇒postgreSQLのCのオブジェクトを読み込む関数を作る際に、 >DB接続関数「PQconnectdb」が未定義とかで認識してくれない。 Cのオブジェクトって自作されたCの共有ライブラリ(UNIX系でしたらso,sl、 Windowsでしたらdll)のことをおっしゃっているのですよね? libpq-fe.hがインクルードされてないとか、libpqがリンクされてないんでは? >上記2つ以外にリモートDBに繋ぎにいく手段をご存知の方がいましたら、 トリガで別DBに接続するには、libpqのPQconnectdbなどを使ってトリガ関数を 作成するしかないと思いますが。 結構たいへんなのでdblinkが提供されているのですが、簡単にやりたいのでしたら、 別DBではなく、同一DB別スキーマで管理すればテーブルの修飾子を変更(加筆)する だけでできると思います。

twin_shu
質問者

お礼

あ、間違えて補足に書いてしまいました(^^; 遅れましたが、貴重な意見ありがとうございました^^

twin_shu
質問者

補足

返答が遅くなりました(^^; >Cのオブジェクトって自作されたCの共有ライブラリ(UNIX系でしたらso,sl、Windowsでしたらdll)のことをおっしゃっているのですよね? >libpq-fe.hがインクルードされてないとか、libpqがリンクされてないんでは? C自体は、libpq-fe.hをかませていてコンパイルが通るんですよ。 さらに、PostgreSQLではなく別方法でそのコンパイルしたオブジェクト(soファイル)を読み込んで実行しても動作するんです。 でも、PostgreSQLの関数から読み込ませると、そのPQconnectdbが未定義だと怒られてしまうのです・・・ もしかして、関数を作るとき、もしくはPostgreSQLの設定で、自分でlibpqをかませるようにしないといけないんですかね?(^^; >同一DB別スキーマ どうもWANを通して別マシンのDBに繋ぎにいきたいらしいのですよ。 なので、その方法は無理なんですよね・・・ まあ、エラー時の処理方法など、半ば無茶な要求だとは自覚してます(^^;

関連するQ&A