2016-06-09 27 views
2

holen Ich bringe Datenbanken aus dem Protokollversand, versuchen, SMO zu verwenden, um es zu tun. Ich versuche, die folgende T-SQL mithilfe von SMO zu imitieren:Wie man SQL Server-Datenbank aus dem "Wiederherstellen" -Modus mit SMO

restore database <database name> with recovery 

Hier mein Code ist:

# 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." 
} 

Der Fehler:

Microsoft.SqlServer.Management.Smo.PropertyNotSetException: To accomplish this action, set property Devices

Die verfügbaren Optionen für DeviceType (von https://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.devicetype(v=sql.105).aspx) sind:

  • Logical
  • Band
  • Datei
  • Rohr
  • Virtualdevice

Das Problem ist, ich weiß nicht, welche DeviceType zu erstellen. Meine Schätzung ist LogicalDevice, aber ich weiß nicht den Wert davon. Hat jemand das schon mal gemacht?

+1

Erwägen Sie einfach 'ExecuteNonQuery' einen' RESTORE $ db MIT RECOVERY' auszustellen. Die Alternative ist die Verwendung von SMO, um sorgfältig herauszufinden, welcher Backup-Satz gerade verwendet wird, so dass Sie die 'Devices'-Eigenschaft richtig einstellen können, aber warum nur durch SMO springen (wenn keine solche Einschränkung in T-SQL existiert)? –

+0

Danke. Es scheint, dass ich auf diese Weise gehen muss, ich hatte gehofft, dass jemand das schon einmal gemacht hat. – SQLEnforcer

+0

Wahrscheinlich jemand, aber da SMO letztendlich nichts anderes macht, als SQL auszuführen, benutzt du SMO, um SMO zu benutzen, was in diesem Fall nichts anderes als eine Geschwindigkeitssteigerung ist. Es gibt Fälle, in denen SMO viel bequemer als einfaches SQL ist (zum Beispiel, wenn Sie viele komplexe Eigenschaften korrelieren müssen, die mit einer Abfrage oder einer Anweisung nicht einfach abgerufen werden können, wäre es sehr mühsam, programmgesteuert zu generieren); das ist keiner von ihnen. –

Antwort

0

Ich bin mit den gleichen Problemen konfrontiert. Ich vermute, dass die Methode sqlRestore auf eine starke Datenbankwiederherstellung von einer Sicherungsdatei/-gerät beschränkt ist. "Online" nur eine Datenbank mit dem Status "Wiederherstellen" bringen (dh Stand by DB aus dem Protokollversand oder von einem defekten AG) scheint nur möglich zu sein, die "Restore-Datenbank mit Wiederherstellung" mit dem appoke-sqlcmd-Applet auszuführen.

Oder wenn jemand hat eine andere Lösung ...

+0

Ihre Antwort sieht wie ein Kommentar zu der Frage statt einer Antwort aus. Wenn Sie einen Kommentar abgeben möchten, müssen Sie [Reputation] (http://stackoverflow.com/help/whats-reputation) ausreichend [http://stackoverflow.com/help/privileges/comment] haben Post. Überprüfen Sie auch dieses [was kann ich stattdessen tun] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can-i-do-instead). – thewaywewere