web-dev-qa-db-ja.com

SQL Serverで2つのデータベースをマージする方法は?

両方のデータベースのスキーマは同じですが、一部のテーブルで主キーとの競合が発生する可能性があります。したがって、重複する行を無視して、さらにマージを続けてほしいと思います。

9
Ish

まず、キーの競合は、現在使用しているプロセスが不十分であることを示しています。

自動生成された(非GUID)キーを使用している2つのデータベースを正しくマージするには、いくつかの手順を実行する必要があります。最初に新しい自動生成キーを親テーブルに追加し、次に両方のテーブルからすべてのデータをインポートし、古い古いファイルの名前をID_oldに変更し、新しいファイルの名前を古いID名に変更します。この時点で、子テーブルに移動できます。親テーブルに結合し、既存のテーブルの値ではなく、新しいidフィールドを外部キーの値として使用して、子テーブルにコピーする必要があります。すべての外部キーテーブルに対してこのプロセスを繰り返す必要があります。そのテーブルが親テーブルでもある場合は、データをコピーする前に、conversionidフィールドをテーブルに追加して、チェーン全体で作業できるようにする必要があります。 。これを適切に行うには、データベースの構造に関する多くの知識と多くの計画が必要です。両方のソースデータベースの適切なバックアップなしでこれを行うことを検討しないでください。また、両方のデータベースがシングルユーザーモードのときにプロセスが発生する可能性がある場合にも最適です。

自然キーを使用していて重複している場合は、まったく別の問題が発生します。重複するすべてのキーレコードは、最初に別のテーブルに移動され、どちらがより正確なデータであるかを判断する必要があります。場合によっては、自然キーが実際には一意ではないことがわかり(ほとんど使用しないのはそのためです)、マージされたデータベースは、ある種の自動生成されたキーで動作する必要があります。これには、データベースの変更だけでなくコードの変更も含まれるため、最後の手段のオプションです。

自然キーでよく見られるのは、それぞれのデータが異なるが類似していることです(アドレスのSt. vice Street)。この場合、レコードの1つに挿入のマークを付け、2つのステップで挿入を行うときは、最初にレコードをマークします。重複がない場合は、挿入のマークが付けられた重複テーブルのレコード。保持するレコードと保持しないレコードを決定するには、すべての外部キーテーブルのすべてのレコードを調べる必要があることを忘れないでください。重複を破棄することは悪い考えであり、その方法でデータ、場合によっては重要なデータ(顧客の注文など)が失われます。これは長く退屈なプロセスであり、データの専門知識を持つ誰かが決定を下す必要があります。プログラマーとして、重複排除ツールを提供して、重複の各セットのすべてのデータを調べ、何を保持し、何を削除するかを選択し、すべてにマークを付けると、レコードを挿入するプロセスが実行されます。 。設計の中で、真の複製の場合、入力するレコードとして選択されたレコード(注文は例)のために、両方からのレコードをデータベースに送信する必要がある子テーブル(注文など)がいくつかあることを覚えておいてください。どちらが正しいか(たとえばアドレス)を選択する必要があります。したがって、これはデータベースを完全に理解する必要がある複雑なプロセスであることがわかります。

重複が多い場合は、数か月間データをクリーンアップして追加している可能性があるため、ツールは非常に重要です。これを行う人々は、データベースの専門家やプログラマーではなく、システムユーザーである可能性があります。これは、どのレコードを保持するかについて、ほとんどの判断を下すことができるのは彼らだけだからです。自動生成されたキーがある場合でもレコードが重複している可能性があるため、いずれにしても同様のことを行う必要があります。それらを見つけるのはもっと難しいです。

2つのデータベースをマージする簡単な方法はありません(GUIDSを使用しても、自然キーが重複するという問題があります)。

9
HLGEM

これは古いトピックですが、多くの投稿に見られる一般的なアプローチについてコメントする必要があります。これは、SQLクエリを使用してすべてをネイティブに実行しようとしています。このようなソリューションに共通しているのは、クエリを適用する前にクエリの作成とテストに費やす必要のあるかなり長い時間です。

そうです–比較的複雑なクエリを使用して2つのデータベースをネイティブにマージできますが、時間を大幅に節約し、サードパーティのツールを無料で使用できます(ほとんどまたはすべてが完全に機能する無料トライアルを備えています)。

市場にはこれらがたくさんあります。すでに他の投稿で言及されているRedGateは、最高の1つですが、 ApexSQL Data DiffdbForgeSQL比較ツールセット およびを試すこともできます。他の多く。

6
Monte Chavis

最善の策は、おそらく RedGate SQL Data Compare などのサードパーティアプリケーションを使用することです。いくらかの費用がかかりますが、そのスクリプトIMOを書くよりも価値があります。

4
Gromer

これが私が近年これを2回行った方法です: http://byalexblog.net/merge-sql-databases

2
Anubis

マージされたデータベース内のすべてのテーブルにフィールド(たとえば、DatabaseIDと呼ばれる)を追加して、それを主キーに追加するだけで済みます。このようにして、マージされたデータベースに一意のキーを保持しながら、元のキーを保持できます。また、行がどのデータベースからのものであるかを知ることができます。これは SQL-Hub が行うことです-それが1回限りの仕事である場合は、無料トライアルでこれを行うことができます。

0
Alan Hickman

IDENTITYとして主キーがある場合は、ここに私の提案があります(スキーマを変更する必要はありません)。

  1. ON UPDATE CASCADEが設定されるようにすべての外部キーを設定します
  2. 親テーブルの主キー/ IDENTITYフィールドを更新し、マージする対応するテーブルのフィールドの最大値を追加します(FKは値を子テーブルにカスケードします)
  3. 子テーブルのPK/IDENTITYフィールドについても同じようにします
  4. このフォーラムの回答 からの提案に従い、SET IDENTITY_INSERT ON/OFFを使用して、各テーブルを挿入します。親テーブルから始めて、子テーブルに移動します。
0
icc97