2016-06-09 24 views
2

我將數據庫帶出日誌傳送,嘗試使用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,但我不知道它的價值。有沒有人做過這個?

+1

請考慮簡單地使用'ExecuteNonQuery'發出WITH RECOVERY'一個'$ RESTORE DB。另一種方法是使用SMO精心設計出當前正在使用的備份集,以便您可以正確設置「Devices」屬性,但是爲什麼只是因爲SMO要求您(當T-SQL中不存在此類限制時)纔會跳過這些環節呢? –

+0

謝謝。看來我需要這樣做,希望以前有人已經這樣做了。 – SQLEnforcer

+0

可能有人有,但是看到SMO如何最終除了執行SQL之外什麼都不做,你基本上是使用SMO爲了使用SMO,這使得它在這種情況下只是一個速度顛簸。有些情況下SMO比普通SQL方便得多(例如,當需要關聯很多複雜的屬性時,使用查詢無法輕鬆檢索這些屬性或語句會以編程方式生成非常麻煩);這不是其中之一。 –

回答

0

我正面臨同樣的麻煩。 我想sqlRestore方法僅限於從備份文件/設備強大的數據庫恢復。 只需將「在線」數據庫與狀態「恢復」(即從日誌傳送或從一個損壞的AG支持數據庫)似乎是可能的,只能使用invoke-sqlcmd小程序執行「使用恢復恢復數據庫」。

或者,如果任何人有其他的解決辦法...

+0

您的回覆看起來像是對問題的評論,而不是回答。如果您打算髮表評論,您需要對[評論](http://stackoverflow.com/help/privileges/comment)有足夠的[聲譽](http://stackoverflow.com/help/whats-reputation)帖子。另外檢查這[我可以做什麼,而不是](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-c​​an-i-do-instead )。 – thewaywewere

相關問題