Изменить логическое имя базы данных с помощью SMO - PullRequest
7 голосов
/ 20 февраля 2010

Как изменить логическое имя базы данных при восстановлении базы данных с помощью SMO?

/ Viktor

Ответы [ 3 ]

9 голосов
/ 19 августа 2010
//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");
5 голосов
/ 20 февраля 2010

Невозможно переименовать файлы логической базы данных с помощью SQL RESTORE DATABASE : не предлагается. Только физические файлы могут быть изменены с помощью WITH MOVE

Вы переименовываете логические файлы, используя ALTER DATABASE в SQL, обычно.

Это подтверждается классом RelocateFile SMO.

0 голосов
/ 28 марта 2012

Код Рахула верен: восстановление в новые физические файлы и переименование логических файлов выполняется в два этапа:

Вызов RelocateFile говорит: «сопоставьте это логическое имя файла с этим физическим файлом». Вам нужно использовать логические имена файлов исходной резервной копии, а НЕ новые, иначе вы, вероятно, получите исключения ".mdf cannot be overwritten".

Для создания новых логических имен используйте вызовы Rename(), как показано в коде Рахула.

Однако, если вы хотите изменить имя базы данных с помощью 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();
...