2016-06-09 2 views
2

Je retire des bases de données de l'envoi de journaux, en essayant d'utiliser SMO pour le faire. Je tente d'imiter l'aide de T-SQL suivante SMO:Comment faire pour sortir la base de données SQL Server du mode "restauration" à l'aide de SMO

restore database <database name> with recovery 

Voici mon code:

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

L'erreur:

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

Les options disponibles pour DeviceType (de https://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.devicetype(v=sql.105).aspx) sont:

  • LogicalDevice
  • bande
  • Fichier
  • pipe
  • VirtualDevice

Le problème est, je ne sais pas qui DeviceType à créer. Ma conjecture est LogicalDevice mais je ne connais pas la valeur de celui-ci. Est-ce que quelqu'un a déjà fait ça?

+1

Il suffit de considérer l'aide 'ExecuteNonQuery' de publier un' RESTORE $ db AVEC RECOVERY'. L'alternative est d'utiliser SMO pour déterminer minutieusement quel jeu de sauvegarde est actuellement utilisé afin de pouvoir définir la propriété 'Devices' correctement, mais pourquoi passer à travers les cerceaux simplement parce que SMO vous le demande (quand aucune restriction n'existe dans T-SQL)? –

+0

Merci. Il semble que j'aurai besoin d'aller dans ce sens, j'espérais que quelqu'un l'avait déjà fait auparavant. – SQLEnforcer

+0

Probablement que quelqu'un l'a fait, mais vu que SMO ne fait finalement qu'exécuter du SQL, vous utilisez SMO pour l'utilisation de SMO, ce qui en fait un ralentisseur dans ce cas. Il y a des cas où SMO est beaucoup plus pratique que SQL simple (par exemple, quand vous avez besoin de corréler beaucoup de propriétés complexes qui ne peuvent pas être facilement récupérées en utilisant une requête ou une instruction serait très lourde à générer par programmation); ce n'est pas l'un d'entre eux. –

Répondre

0

Je suis confronté au même problème. Je suppose que la méthode sqlRestore est limitée à une restauration de base de données robuste, à partir d'un fichier/périphérique de sauvegarde. Apporter simplement "online" une base de données avec le statut "restoring" (ie stand by db de l'envoi de logs ou d'une AG cassée) ne semble possible qu'en exécutant la "restore database with recovery" avec l'applet invoke-sqlcmd.

Ou si quelqu'un a une autre solution ...

+0

Votre réponse ressemble à un commentaire à la question au lieu d'une réponse. Si vous avez l'intention de commenter, vous devez disposer de suffisamment de [réputation] (http://stackoverflow.com/help/whats-reputation) pour [comment] (http://stackoverflow.com/help/privileges/comment) sur tout poster. Vérifiez également ceci [que puis-je faire à la place] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can-i-do-instead). – thewaywewere