我將數據庫帶出日誌傳送,嘗試使用SMO執行此操作。我試圖使用SMO模仿下面的T-SQL:如何使用SMO將SQL Server數據庫帶出「還原」模式
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: To accomplish this action, set property Devices
爲DeviceType
可用選項(從https://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.devicetype(v=sql.105).aspx )是:
- 邏輯設備
- 磁帶
- 文件
- 管
- VirtualDevice
的問題是,我不知道要創造出DeviceType
。我的猜測是LogicalDevice
,但我不知道它的價值。有沒有人做過這個?
請考慮簡單地使用'ExecuteNonQuery'發出WITH RECOVERY'一個'$ RESTORE DB。另一種方法是使用SMO精心設計出當前正在使用的備份集,以便您可以正確設置「Devices」屬性,但是爲什麼只是因爲SMO要求您(當T-SQL中不存在此類限制時)纔會跳過這些環節呢? –
謝謝。看來我需要這樣做,希望以前有人已經這樣做了。 – SQLEnforcer
可能有人有,但是看到SMO如何最終除了執行SQL之外什麼都不做,你基本上是使用SMO爲了使用SMO,這使得它在這種情況下只是一個速度顛簸。有些情況下SMO比普通SQL方便得多(例如,當需要關聯很多複雜的屬性時,使用查詢無法輕鬆檢索這些屬性或語句會以編程方式生成非常麻煩);這不是其中之一。 –