#SQL Serverで古いバージョンへDB構造を移したい
##古いバージョンへは直接復元ができない
開発環境から実行環境へ、テーブル構造を移し込みたい。
開発環境のSQL Server Management Studioでバックアップを作成し、実行環境でDBを復元しようとしたところ、エラーが出た。
データベース ××× の復元に失敗しました。(Microsoft.SqlServer.Management.RelationalEngineTasks)
追加情報:System.Data.SqlClient。SqlError:データベースはバージョン ××× を実行中のサーバーにバックアップされました。このバージョンは、このサーバー(バージョン ××× を実行)とは互換性がありません。(略)(Microsoft.SqlServer.SmoExtended)
このエラーが出た手順は、以下の通り。
リストア先で新しいDBを作成する(以下の例ではProduct_MngというDBを作成した)。
タスク → 復元 → データベース を選択する。
データベースの復元ウィンドウが開かれるので、バックアップデバイスを選択して、OKをクリックする。
すると前述のエラーが表示された。
##原因
SQL Serverのバージョンが異なることが原因。上位互換がなく、新しいバージョンのバックアップを古いバージョンでリストアすることはできない。バックアップを作った開発環境のSQL Serverと、リストアする実行環境のSQL Serverのバージョンを調べてみる。
###SQL Serverのバージョンの調べ方
SQL Server Management Studioのヘルプ → バージョン情報から表示されるバージョンは、Management Studioのバージョンであって、SQL Serverのバージョンではない。SQL Serverのバージョンを調べるには、Management Studioにて以下のコマンドを入力するとよい。
SELECT @@VERSION
バックアップしたSQL Serverのバージョンは、2016 SP1だった。
リストアするSQL Serverのバージョンは、2014だった。
このような場合は直接復元ができない。SQL Serverのバージョンを最新に統一すれば問題ないのだが、実行環境を変更できない事情があるため、該当の2014をバージョンアップするわけにはいかない。
##復元方法
直接復元ができないので、テーブルごとに作成スクリプトを保存し、それをリストア先で実行することにした。
バックアップ元のSQL Server Management Studioで、各テーブルごとに右クリックからテーブルをスクリプト化 → 新規作成 → ファイル を選択する。その後、適当なファイル名を付けて保存する。
次に、リストア先で、保存したファイルを開き、Product_Mngのデータベースを選択して実行する。テーブル作成に成功すれば「コマンドは正常に完了しました。」と表示される。
作成できたテーブルを確認すると、正しく構造が正しく移し込まれている。