使用 SMO 更改逻辑数据库名称

Posted

技术标签:

【中文标题】使用 SMO 更改逻辑数据库名称【英文标题】:Change logical database name with SMO 【发布时间】:2011-01-19 01:31:00 【问题描述】:

使用 SMO 恢复数据库时如何更改逻辑数据库名称?

/维克托

【问题讨论】:

你是指数据库名还是文件名?以下所有答案似乎都假设您的意思是逻辑文件名? 【参考方案1】:
//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");

【讨论】:

【参考方案2】:

您不能使用 SQL RESTORE DATABASE 重命名逻辑数据库文件:不提供。使用 WITH MOVE 只能更改物理文件

您通常在 SQL 中使用 ALTER DATABASE 重命名逻辑文件。

RelocateFile SMO 类似乎证实了这一点。

【讨论】:

【参考方案3】:

Rahul 的代码是正确的:恢复到新的物理文件和重命名逻辑文件是一个两步过程:

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

【讨论】:

以上是关于使用 SMO 更改逻辑数据库名称的主要内容,如果未能解决你的问题,请参考以下文章

关于SVM数学细节逻辑的个人理解 :SMO算法理解

使用 SMO 复制数据库和数据

如何在 C# 中使用 SMO 使用 FILE STREAM 备份和恢复数据库

通过 C# 和 SMO 检查和删除现有表

使用PowerShell和SMO库从.BAK文件创建新数据库

smo 的 IsSystemObject 属性