2016-06-09 16 views
2

Я вывожу базы данных из журнальной доставки, пытаясь использовать SMO для этого. Я пытаюсь имитировать следующий T-SQL с помощью SMO:Как привести базу данных SQL Server из режима «восстановления» с помощью SMO

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):

  • LogicalDevice
  • лента
  • Файл
  • Труба
  • VirtualDevice

Проблема заключается в том, я не знаю, какой DeviceType создать. Мое предположение - LogicalDevice, но я не знаю его значения. Кто-нибудь делал это раньше?

+1

Считайте просто с помощью 'ExecuteNonQuery' выдавать' RESTORE $ дБ RECOVERY'. Альтернативой является использование SMO для кропотливого определения того, какой набор резервных копий используется в настоящее время, поэтому вы можете правильно установить свойство 'Devices', но зачем переходить через обручи только потому, что вам требуется SMO (когда такое ограничение не существует в T-SQL)? –

+0

Спасибо. Похоже, мне нужно идти таким образом, надеялся, что кто-то уже это сделал раньше. – SQLEnforcer

+0

Возможно, у кого-то есть, но, видя, что SMO в конечном счете ничего не делает, кроме SQL, вы в основном используете SMO ради использования SMO, что делает его не чем иным, как ударом скорости в этом случае. Существуют случаи, когда SMO гораздо удобнее обычного SQL (например, когда вам нужно сопоставить множество сложных свойств, которые невозможно легко получить с помощью запроса или инструкции, было бы очень громоздким, чтобы генерировать программно); это не один из них. –

ответ

0

У меня такая же проблема. Я предполагаю, что метод sqlRestore ограничен сильным восстановлением базы данных из файла/устройства резервного копирования. Простое создание «онлайн» базы данных со статусом «восстановление» (т. Е. Стоять на db из лог-доставки или из сломанного AG) кажется возможным только выполнение «восстановления базы данных с восстановлением» с помощью апплета invoke-sqlcmd.

Или если кто-то имеет другое решение ...

+0

Ваш ответ выглядит как комментарий к вопросу, а не ответ. Если вы намерены комментировать, вам нужно иметь [репутацию] (http://stackoverflow.com/help/whats-reputation) для [комментариев] (http://stackoverflow.com/help/privileges/comment) на любом после. Также проверьте это [что я могу сделать вместо этого] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can-i-do-instead). – thewaywewere