SMO を使用してデータベースを復元するときに、論理データベース名を変更するにはどうすればよいですか?
/ヴィクトル
//restore is the Restore object in SMO
restore.RelocateFiles.Add(new RelocateFile(SourceDataFile.Name, Path.Combine(destinationDirectory, destination.Database + ".mdf")));
restore.RelocateFiles.Add(new RelocateFile(SourceLogFile.Name, Path.Combine(destinationDirectory, destination.Database + "_log.ldf")));
restore.SqlRestore(destinationServer);
var destinationDatabase = destinationServer.Databases[destinationDatabaseName];
//renaming the logical files does the trick
destinationDatabase.FileGroups[0].Files[0].Rename(destinationDatabaseName);
destinationDatabase.LogFiles[0].Rename(destinationDatabaseName + "_log");
SQL RESTORE DATABASEを使用して論理データベース ファイルの名前を変更することはできません。提供されていません。WITH MOVE を使用して変更できるのは、物理ファイルのみです。
通常、論理ファイルの名前を変更するには、SQL でALTER DATABASEを使用します。
これはRelocateFile SMO クラスによって確認されているようです。
Rahul のコードは正しいです。新しい物理ファイルへの復元と論理ファイルの名前の変更は、2 段階のプロセスです。
呼び出しは、RelocateFile
「この論理ファイル名をこの物理ファイルにマップする」と言っています。ここでは、新しいものではなく元のバックアップの論理ファイル名を使用する必要があります。そうしないと、" .mdf cannot be overwritten
" 例外が発生する可能性があります。
新しい論理名を作成するにはRename()
、Rahul のコードに示されているように、後で呼び出しを使用します。
ただし、SMO を使用してデータベースの名前を変更する場合は、次のようにします。
var srvConn = new ServerConnection(serverName)
{
LoginSecure = false,
Login = dbUserName,
Password = dbUserPassword,
DatabaseName = "master",
};
var mainDb = new Database(srvConn, "old database name");
mainDb.Rename("new database name");
mainDb.Refresh();