旧バージョンからSQL Server2012への移行(3/3)

記事タイトルとURLをコピーする
開発部の新坂です。 前回のエントリでは実際にデータの移行手順を行いましたが、移行ツールだけではデータベースを正確に移行できないことがわかりました。
今回は上記問題の対応も含めて、全体の流れをおさらいします。

移行手順全体の流れ

全体の流れを再確認しましょう。 1. 移行先に(プライマリキーや制約情報が正しく設定された)最終データベースとテーブルを手動で作成
2. 移行先に一時保存用データベースを手動で作成(テーブルは作成しない)
3. SQL Serverインポートエクスポートツールで移行先の一時保存用データベースへテーブルをコピー
4. 移行先の一時保存用データベースから、移行先の最終データベーステーブルへデータをコピー

移行先に(プライマリキーや制約情報が正しく設定された)最終データベースとテーブルを手動で作成

データベースの作成は 記事(1/3) を参照してください。
プライマリキーや制約情報を含むテーブル作成のためには、SQL Management Studioの機能を使えば簡単にCREATE TABLE SQL が生成できます。

移行先に一時保存用データベースを手動で作成(テーブルは作成しない)

データベースの作成については 旧バージョンからSQL Server2012への移行(1/3) を参照してください。データの一時保存用ですので、適切なデータベース名で作成しましょう。
テーブルは次のステップで作成します。

SQL Serverインポートエクスポートツールで移行先の一時保存用データベースへテーブルをコピー

SQL Serverインポートエクスポートツールの操作については、旧バージョンからSQL Server2012への移行(2/3) を参照してください。
このステップではデータのみのテーブルを一時保存用データベースへ作成します。

移行先の一時保存用データベースから、移行先の最終データベーステーブルへデータをコピー

ここが今回のポイントになります。今回の2テーブルの場合、下記のように記述すればコピーできます。
-- prefectureテーブルINSERT
SET IDENTITY_INSERT newdb_prod..prefecture ON;
INSERT INTO newdb_prod..prefecture (id, name, prefecture_id) SELECT id, name, prefecture_id FROM newdb..person;
SET IDENTITY_INSERT newdb_prod..person OFF;

-- personテーブルINSERT
SET IDENTITY_INSERT newdb_prod..person ON;
INSERT INTO newdb_prod..person (id, name, prefecture_id) SELECT id, name, prefecture_id FROM newdb..person;
SET IDENTITY_INSERT newdb_prod..person OFF;
今回は、一時保存用データベースを 「newdb」、最終データベースを「newdb_prod」としています。
SET IDENTITY_INSERT <データベース名>..<テーブル名> {ON|OFF}」という記述があります。SQL Serverでは、自動的に連番を割り振るよう指定した列へ、値を指定したINSERTすることは制約されているのですが、この制約を一時的に解除/再開する文です。
上記を除けば、同じ列を持つテーブルの全行をINSERTするだけの単純なSQL文となります。
外部キー制約があるため、実行順序は留意します。この例では、personテーブルはprefectureテーブルを外部キー参照するため、prefectureテーブルを先にINSERTしています。

移行完了

テーブルのプライマリキーや制約情報が移行元と同じように設定されていること、データ内容が同一であることを確認して、データベースを移行完了です。

まとめ

全3回に渡って旧バージョンからSQL Server2012への移行手順を紹介しました。
ちょっと手順が複雑になってしまいましたが、もっとスマートな手順を紹介できるように精進してまいりたいと思います。
移行って簡単ではありませんね。お疲れさまでした。