• ベストアンサー

トリガーを使ったリモート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

  • DBリンク経由の参照について

    サーバ【A】のスキーマ【あ】にDB【テーブル1】があります。 サーバ【A】のスキーマ【い】に、【あ】からセレクト権限を与えた所、【い】から【テーブル1】を参照できるようになりました。 次に、 サーバ【B】からサーバ【A】にDBLINKをはりました。 (tnspingで接続されているのを確認済)。 これで、 サーバ【B】のスキーマ【あ】からDBLINK経由で【テーブル1】を参照できるようになりました。 しかし、サーバ【B】のスキーマ【い】から【テーブル1】が参照できません。 私としては、スキーマ同士の権限を与え、DBLINKが正しく繋がっているので、参照できるのでは??と思うのですが、 何度やっても、 --------------------------------------------------------------- ORA-04043: オブジェクト"【あ】"."【テーブル1】"は存在しません。 --------------------------------------------------------------- が表示されてしまいます。 原因として何が考えられるでしょうか…?? 説明不足だったらすみません。 何か考えられる可能性があったら教えて下さい。

  • 異なるDB間の同期

    サーバ1  OS:Windows2003Server DB:SQL Server2005 サーバ2  OS:Windows2000Server DB:SQL Server2000 サーバ2からサーバ1へODBC、HTTP、FTP可 サーバ2のDBは(サーバ1ではない)別サーバから 更新、削除、登録が行われます。このときにサーバ1の DBと同期を取る方法を検証しています。 例えば、サーバ2のAテーブルが更新された場合に トリガーなんかでサーバ1のAテーブルを更新する。 みたいな方法です。 ほかに簡単にできる方法とか、 特殊な方法でやらないとできないとか、 まったくできないとか 何か情報いただけないでしょうか。

  • DBの設計について

    MySQLの設計について質問があります。 まずDBの設計ですが以下のような場合どのようにすればよいのでしょうか? 1. 商品情報が数十万件あり、商品DBを作ってその中に全商品を登録するテーブルを作る 2. 各会員が上記の中から自分が扱いたい商品を登録するテーブルが必要 このとき、2.のテーブルは、  A. 1.のDBの中に作る  B. 各会員のDBを作ってその中に扱いたい商品のテーブルを作る  C. 会員DBを作って会員ごとのテーブルを作る のどれが正しいのでしょうか?各会員が扱う商品数も数万~数十万件になります。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • トリガーとシーケンスについて

    DBはOracle9i(Ver9.2.0.1かな?)です。 テスト環境から本番環境にデータ移行する際に テーブルも変更を加えました。 すると変更を加えたテーブルに関連するトリガーが未コンパイル状態になってしまいました。 仕方なく、再コンパイルするとトリガーに記述のあるシーケンスの最終番号が若干ずれていました。 コンパイルすることによってずれることがあるのでしょうか? シーケンスは初期化されたわけではなく、若干ずれてるだけです。 そのシーケンスを使用して登録処理を行っているので一意制約違反がでまくりです。 どなたかアドバイスお願いします。

  • DBを乗っ取る方法

    DB名やTable名を取得する事が出来る事は分かりましたが(DBの種類に依るようですが)、 DBユーザ名やパスワードを取得する事が出来なければDB自体を乗っ取る事が出来ないのだと思っています。 が、それらを取得する方法はあるのでしょうか? もしくは別の手段で乗っ取る事が出来るのでしょうか? 別にどこかのDBを乗っ取るのではなく、勉強する上で知りたいのです。 書籍などで勉強していますが、上記のような事についてはどこにも記されていないのです。 どなたか手法をご教示下さい。 そして願わくば対処法、もしくは攻撃手法名もお願い致します。

  • [PostgreSQL]別DBのテーブルのSelect、Insert

    お世話になっております PostgreSQL8.1を使用しまして あるテーブルにInsertがかかると その内容を判断し別のテーブルに insertをする仕組みが必要になり いろいろ試してみて TriggerとFunctionを使用すれば 実装できるとこまでわかりました。 ただしその別テーブルが別DBに配置されているので そのテーブルに以下のようなInsert文を発行しても エラーになってしまいます。 Insert into SUB_DB.TEST_TBL values('test','date'・・・・); (SUB_DB:ストアドを実行しているのとは別のDB) ストアドから別テーブルを参照更新する手段を ご存知のかたご教授いただけますでしょうか。 よろしくお願いいたします。

  • 異なるDBの値比較方法

    まったく同じジョブの内容でスケジューリング方法を変えて実行した時、その前後でDBの内容が同一であるか検証する方法を考えています。 DBはoracle9、テーブル数は約100強、エクスポートすると約500MBです。 検証方法は、処理前に本番データをエクスポートし、それを検証環境にインポート、検証環境でスケジュールを実行して、まったく同じ結果を得られるかを検証します。 以下の案を思いつきましたが、イマイチぴんときません。何かいい方法を教えてください。 案1 DBをDBリンクで接続し、オブジェクトブラウザのオブジェクト比較機能を使う。 →簡単にできるが、結果を得るの時間がかかりすぎる。 案2 DBをDBリンクで接続し、検証用プロシージャを作成して比較する。 →user_tables, user_tab_columnsなどを使うプロシージャの作成が面倒。 案3 処理実行後に、本番と検証環境でそれぞれテーブルごとにエクスポートし、エクスポートファイルをUNIXでソートした上で、uniqコマンドで比較する。 →これが現実的?

  • 登録する方法

    SQL server 2000で接続セッションのIPアドレスをトリガーでテーブル登録する方法を教えてください。あるテーブルの「更新IPアドレス」という文字列項目に、そのレコードが固定編集された時にクライアント端末のIPアドレスをトリガーで、登録したいのですが、方法を教えてください

  • レコードの更新履歴について

    Oracle初心者です。 レコードの更新履歴を残す方法を考えているところです。 ■やりたいこと 1)登録、更新、削除の全てについて 2)実行前のレコードを抽出したい 3)特定レコードの更新履歴を一覧として表示したい ■対象レコード ID(主キー、ユニーク) フィールドA(テキスト) フィールドB(テキスト) フィールドC(テキスト) 1つ方法として・・・ 履歴を残したいテーブルと同じ構造の履歴テーブルを作成して、登録、更新、削除が行われる際、必ずこの履歴テーブルに登録することを考えました。 が、あまりスマートでない気もしましたので質問します。 他によい案はありますでしょうか?

  • DB2のテーブルにデータをロードする方法を教えてください。

    DB2のテーブルにデータをロードする方法を教えてください。 <環境> マシンA・・・OS WINDOWS2000SERVER マシンB・・・AS400 DB2 OS400Ver4.5 質問1 マシンA上で作成したCSVファイルを使用して、マシンBのDB2にデータをロードする方法を教えてください。 リモートから直接データがロードできるのであれば、各マシンにインストールする必要がある製品と、方法、サンプルスクリプトがあると助かります。 おそらくマシンBにデータを転送した後、DBのローダーをリモートで起動する処理になるかと思うのですが、詳しい方法が分かりません。 質問2. マシンA上で作成したUPDATE文を使用して、マシンBのDB2にデータを更新する方法を教えてください。 リモートから直接データが更新できるのであれば、各マシンにインストールする必要がある製品と、方法、サンプルスクリプトがあると助かります。 以上、2点になります。よろしくお願い致します。