2010-02-20 37 views
7

如何在使用SMO恢復數據庫時更改邏輯數據庫名稱?使用SMO更改邏輯數據庫名稱

/維克托

+0

你的意思是數據庫的名稱,或文件名?下面的所有答案似乎都假設你是指邏輯文件名? – Tao 2011-08-05 09:54:37

回答

4

你不能用一個SQL RESTORE DATABASE邏輯數據庫文件重命名:它沒有提供。只有物理文件可以使用WITH MOVE來更改

通常在SQL中使用ALTER DATABASE重命名邏輯文件。

這似乎是由RelocateFile SMO類確認。

8
//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"); 
0

拉胡爾的代碼是正確的:還原到新的物理文件和重命名邏輯文件是一個兩步的過程:

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();