2011-01-31 3 views
0

DB1で1つのテーブル(DB1.t1)に1つのカラムを追加し、同じ名前のテーブルに同じ行のレプリカを作成すると、 )を別のDB2にインストールします。挿入された行のIDを使用して、DB2の別のテーブル(DB2.t2)にいくつかの行を追加する必要があります。1つのトランザクション内に複数のデータベースがある場合の外部キーの問題

問題は、DB1.t1とDB2.t2に1つのトランザクションで挿入する必要があるということです。これを実行しようとすると、DB1.t1は正常に挿入されますが、コミットされていないためDB2.t1には行が含まれていないため、DB2.t2は新しい行(外部キーがありません)を挿入できませんでした正しく。

1つのオプションはDB1トランザクションをコミットしてから、DB2操作を行いますが、他の機能も関連しています。それを達成するための最良の方法を提案してください。

答えて

0

ストアドプロシージャ内で1回のトランザクションですべて実行します。オンラインの書籍で取引を行う方法を調べる。エラーの場合は、ロールバックを入れてください(try catchブロックを使用してください)。また、OUTPUT句またはScope_identity()を使用して、table1からIDを取得します。

+0

私はあなたが尋ねたのと同じ方法でやっています。私はDB1上で1つのSPを呼び出しており、SPからは2番目のDB2 spが呼び出されています。どちらも1つのトランザクションの下にありますが、私はDB1からIDを取得できますが、同じIDはDB2上にないため、常に例外がスローされてロールバックされます。 – hungryMind

3

まあ、Idの列は意味のある「キー」ではありません。彼らはあなたをどこにでも連れて行きます。彼らは無意味で、身体的な識別子であると思われ、あなたはそれらに意味を付けました。同じIdsが別のデータベースに存在することを要求するとき。

あなたはFK違反を解決しましたか?ほとんどの場合、DB2のDB1行には全く異なるIdがあります。確かに異なる親のIdsです。

あなたは一貫し ないは、両方のデータベースでは、 Id値を指定 Id値を指定し、サーバはそれを記入しましょう、または常に する必要があります。

第2の問題は、あなたがトランザクション的に驚くことではないということです。マルチdbトランザクションはまったく問題ありません。従って、Idの列、それに含まれているものを忘れて、両方のDbsで表の実際のキーを使用してください。 idsは異なっていますが、誰が気にかわります(つまり、無意味な識別子に意味を付ける必要がなくなります)。

関連する問題