2015-04-27 12 views
6

Ho ottenuto questo cmdlet per ripristinare un database e funziona correttamente se non c'è nulla che utilizzi il database esistente.Come sovrascrivere in modo affidabile il database esistente utilizzando il cmdlet Restore-SqlDatabase di Powershell

Restore-SqlDatabase -ServerInstance $databaseServerInstance -Database $database -BackupFile $backupLocation -ReplaceDatabase 

Ma sovrascrittura non riesce quando il database è in uso con:

System.Data.SqlClient.SqlError: Exclusive access could not be obtained because the database is in use

io non riuscivo a capire se c'è un modo semplice (tramite un argomento) per ignorare questo e uccidere le connessioni o mettere il database in modalità utente singolo. C'è una cosa del genere? o devo passare a SMO per fare qualcosa di più complicato di un ripristino di base?

Attualmente sto utilizzando una soluzione alternativa per utilizzare l'API SMO per eliminare il DB, ma mi piacerebbe semplificarlo se possibile.

+0

Grazie per la PS a portata di mano :) aiutato! –

risposta

0

Impostare il database su single user mode e ripristinare le transazioni esistenti. Questo viene fatto con una dichiarazione Tsql in questo modo,

ALTER DATABASE MyDatabase SET SINGLE_USER WITH ROLLBACK IMMEDIATE; 

Come si è già su di esso, perché non sbarazzarsi del database prima di fare il ripristino?

USE master; -- or some other db than the one you are going to drop 
DROP DATABASE MyDatabase; 

Un altro approccio è quello di restore the database con utilizzando l'opzione WITH REPLACE.

+0

Stavo cercando una soluzione PowerShell che non includa script SQL. Ne ho già uno che funziona, ma ha bisogno di rilasciare DB - vedere nella mia domanda sopra. Ma ho pensato che il cmdlet "Restore-SqlDatabase" funzionasse con alcune flag di cui non mi occupo. – lahsrah

2

Sto usando Invoke-SqlCmd per questo. Invoke-SqlCmd fa parte del modulo sqlps, che può essere scaricato da here:

Push-Location; 
Import-Module sqlps -DisableNameChecking; 
Pop-Location 

$serverPath = "SQLSERVER:\SQL\localhost\Default" 
$databaseName = "YOUR_DATABASE" 
$restoreFrom = join-path (Get-Location) "$databaseName-before.bak" 

$databasePath = join-path $serverPath "Databases\$databaseName" 
if(Test-Path $databasePath) 
{ 
    Invoke-SqlCmd "USE [master]; ALTER DATABASE [$databaseName] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; DROP DATABASE [$databaseName]" 
} 

Restore-SqlDatabase -Path $serverPath -Database $databaseName -BackupFile $restoreFrom 

Potete trovare ulteriori informazioni su come utilizzare Invoke-Sqlcmd qui:

Effectively Using Invoke-SqlCmd

SQL SERVER – FIX – The term ‘Invoke-Sqlcmd’ is not recognized as the name of a cmdlet

0

Ci non è un argomento in Restore-SqlDatabase per uccidere tutti i processi che utilizzano il database che si desidera ripristinare.

È possibile eseguire lo script di seguito per una documentazione completa di argomenti a Restore-SqlDatabase

get-help Restore-SqlDatabase -full 
Problemi correlati