これが事実です。私は2つの異なる地理的領域に対して自分のWebサイトの同一のコピーを実行しています。現在、サイトは複数通貨の価格設定をサポートしているので、両方のサイトをマージしたいと思います。
マージする必要があるすべてのテーブルはIDベースであり、愚かにもデータベースの各コピー内の一致するテーブルは同じ数でシードされました。
あるデータベースから別のデータベースにデータを同時にコピーして、参照されるテーブルの外部キー値にも反映される新しいID値をコピーデータに与える方法はありますか?
つまり.
Account
- Id
- Email
- FirstName
- etc
AccountImage
- Id
- Account_id
- FileName
- etc
等々..
私が何かを見逃していない限り、あなたの問題はデータを移動していないのではなく、すでに設定されているID値を処理しています。その場合は、これを試してください。
値に一貫性がある限り、すべての関係を追加しても、結合されたDBには同じままです。だから例えば
現在の最大IDがDB Aに200,000、DB Bに1,400,000の従業員テーブルがあります。データの移動を減らすため、データをDB AからDB Bに移動することにしました。従業員テーブルを移動すると、Employee_Id列に2,000,000が追加されます。
USE DatabaseB
GO
SET IDENTITY_INSERT Employee ON
INSERT INTO Employee (Employee_Id, Other_Columns)
SELECT Employee_Id + 2000000, Other_Columns
FROM DatabaseA.dbo.Employee
SET IDENTITY_INSERT Employee OFF
GO
そして、最後のアドバイスは、間違えた場合に備えて、始める前にすべてをバックアップします:)
両方のデータベースが同じサーバーで、両方のデータベースにアクセスする権限がある場合
方法1:
メインデータベース全体をスクリプト化して新しいデータベース名で実行すると、メインデータベースのスキーマとデータが同じになります(SQL Server 2008バージョン以降で可能)
方法2:
スキーマ、リレーションシップ、データを含むいくつかのテーブルのみが必要な場合は、メインデータベースからスクリプトを作成します
テーブル階層をたどる-1.マスターテーブル2.チャイルドテーブル
同じ順序で実行します
方法3:
テーブルのスキーマとデータのみが必要な場合は、IMPORT/EXPORT
おそらく最も簡単な方法は、挿入...選択を行い、同時にset identity_insert onを使用して再参照し、既存のIDに固定値を追加して、データセット間の競合を確実に防ぐことです。
このようなもの:
set identity_insert myTable on
insert into db1.dbo.myTable
( identity_column, [column, column...] )
select identity_column+1000, [column, column...]
from db2.dbo.myTable
set identity_insert myTable off