【发布时间】:2016-06-09 23:33:35
【问题描述】:
我正在将数据库从日志传送中移除,并尝试使用 SMO 来完成。我正在尝试使用 SMO 模仿以下 T-SQL:
restore database <database name> with recovery
这是我的代码:
# select secondary_database from msdb.dbo.log_shipping_secondary_databases
$dsSecLSDB = $secInst.Databases["MSDB"].ExecuteWithResults("select secondary_database from log_shipping_secondary_databases")
$secLSDB = $dsSecLSDB.Tables.Rows
foreach($db in $secLSDB.secondary_database) {
write-host "Restoring database (bringing online)..."
$secRestrObj = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Restore -Property @{
Action = 'Database';
Database = $db;
NoRecovery = $FALSE;
}
$secRestrObj.SqlRestore($secInst);
write-host "Done with restore."
}
错误:
Microsoft.SqlServer.Management.Smo.PropertyNotSetException:要完成此操作,请设置属性 Devices
DeviceType(来自https://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.devicetype(v=sql.105).aspx)的可用选项有:
- 逻辑设备
- 胶带
- 文件
- 管道
- 虚拟设备
问题是,我不知道要创建哪个DeviceType。我的猜测是LogicalDevice,但我不知道它的价值。以前有人做过吗?
【问题讨论】:
-
考虑简单地使用
ExecuteNonQuery发出RESTORE $db WITH RECOVERY。另一种方法是使用 SMO 费力地找出当前正在使用的备份集,以便您可以正确设置Devices属性,但为什么仅仅因为 SMO 要求您这样做(当 T-SQL 中不存在此类限制时)就跳过箍? -
谢谢。看来我需要走那条路,希望以前有人已经这样做了。
-
可能有人有,但是看到 SMO 最终除了执行 SQL 之外什么都不做,你基本上是为了使用 SMO 而使用 SMO,这在这种情况下只是一个减速带.在某些情况下,SMO 比普通 SQL 方便得多(例如,当您需要关联许多无法使用查询轻松检索的复杂属性时,或者以编程方式生成语句会非常麻烦);这不是其中之一。
标签: sql-server database restore using smo