以前の記事「【VB.NET】SQL Serverの指定したデータベースを復元(リストア)する 」に関連した内容です。

バックアップファイルからデータベースを復元すると、デフォルトの設定では、バックアップ時の設定をそのまま復元します。
そのため、データベースの情報を格納しているデータファイルやログファイル等もバックアップ作成時の場所に復元されます。
但し、復元するデータベース名は、自由に設定できます。

しかし、復元する場合、データファイルの保存場所が異なる等の違いがあることが多々あります。
この場合、データファイルやログファイルの復元先を指定して復元する必要があります。
今回は、この方法について説明します。

SQL Serverでは、データファイルやログファイルを論理名と物理ファイル名をセットで保持しています。
復元時には、このセットを正しく指定することで、データファイルやログファイルの復元先を変更することができます。
論理名は、SQL Serverで使用する物理ファイル名を参照するためのシンボルのことです。

論理ファイル名は、以下の手順で確認できます。
 1.SQL Server Management Studioを起動する。
  [スタート]-[プログラム]-[Microsoft SQL Server 2008]-[SQL Server Management Studio]を実行する。
 2.左側のツリーから確認したいデータベースを選択し、右クリックする。
 3.表示されたメニューから[プロパティ]を選択する。
 4.左側のツリー(ページの選択)から[ファイル]を選択する。
 5.[データベースファイル]の一覧にある[論理名]を確認する。

ここで確認した論理名をコードで指定する必要があります。
※以下のサンプルでは、論理名が以下の場合を例として説明します。
 ・データファイルの論理名:「sample」
 ・ログファイルの論理名 :「sample_log」

以下、サンプルです。
《事前準備》
 1.新しいWindowsアプリケーションプロジェクトを作成する。
 2.参照設定を追加する。
  1)メニューから[プロジェクト]-[参照の追加]を選択する。
  2)[.NET]タブを選択する。
  3)以下の《参照設定で追加するライブラリ》を選択し、[OK]ボタンを押す。
 3.フォームにボタン(Button)を配置する。
  →ボタンのコントロール名はデフォルトのままとします。

《参照設定で追加するライブラリ》
 1.Microsoft.SqlServer.Smo.DLL
  →SMOクラスの中核となるクラス・ライブラリ
   (Database、Server、Backup、Restore等)
 2.Microsoft.SqlServer.ConnectionInfo.DLL
  →SQL Serverオブジェクトへの接続の管理を支援するクラス・ライブラリ
 3.Microsoft.SqlServer.SqlEnum.dll
  →SMOで利用する列挙体の定義
 4.Microsoft.SqlServer.SmoEnum.dll
  →SQL Serverオブジェクトを一意に識別するためのクラス・ライブラリ
  「Uniform Resource Name(URN)アドレス」にアクセスするUrnクラス等)

《コード》
Imports Microsoft.SqlServer.Management.Smo

Public Class Form1
Private Sub RestoreButton_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles RestoreButton.Click

Try
'サーバへの接続情報を設定
Dim wkServer As New Server
wkServer.ConnectionContext.ServerInstance = "localhost"
wkServer.ConnectionContext.LoginSecure = True

'復元に利用するバックアップを指定
Dim wkRestore As New Restore
Dim backupFile As String
backupFile = "D:\test.bak"

'バックアップ装置を指定する
Dim Device As New BackupDeviceItem(backupFile, DeviceType.File)
wkRestore.Devices.Add(Device)

'バックアップが破損していないかどうかを確認する
'破損している場合は、エラーメッセージを表示して終了

Dim ErrorMessage As String = ""
If wkRestore.SqlVerify(wkServer, ErrorMessage) = False Then
MessageBox.Show(ErrorMessage, "エラー")
Exit Sub
End If

'復元するデータベースの指定
Dim destinationDBName As String
destinationDBName = "Sample1"

'復元するデータベースの論理データとログファイルの保存場所を指定
'論理名は、確認した論理名を指定する

Dim relocateData As New RelocateFile()
relocateData.LogicalFileName = "sample"
relocateData.PhysicalFileName = "C:\sample1.mdf"
Dim relocateLog As New RelocateFile()
relocateLog.LogicalFileName = "sample_log"
relocateLog.PhysicalFileName = "C:\sample1.ldf"

wkRestore.RelocateFiles.Add(relocateData)
wkRestore.RelocateFiles.Add(relocateLog)

'復元(リストア)の動作を決める
wkRestore.Action = RestoreActionType.Database
wkRestore.Database = destinationDBName
wkRestore.ReplaceDatabase = True
wkRestore.PercentCompleteNotification = 10

'復元(リストア)の実行
wkRestore.SqlRestore(wkServer)

MessageBox.Show("完了", "通知")
Catch ex As Exception
MessageBox.Show(ex.Message, "エラー")
End Try
End Sub
End Class

【補足事項】
・前回の記事では、現在のデータベースから論理名を取得しています。
 そのため、前述した論理名の確認が不要でした。
・データベース作成時の論理名は、以下がデフォルトとなります。
 データファイル名:データベース名
 ログファイル名 :データベース名_log
 ※論理名は変更することができます。