2015-04-27 11 views
6

Ich habe dieses Cmdlet zum Wiederherstellen einer Datenbank und es funktioniert gut, wenn nichts die vorhandene Datenbank verwendet.So überschreiben Sie vorhandene Datenbank mit PowerShell Restore-SqlDatabase-Cmdlet

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

aber überschreiben schlägt fehl, wenn die Datenbank in Betrieb ist mit:

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

Ich konnte nicht herausfinden, ob es eine einfache Möglichkeit ist (über ein Argument) diese außer Kraft zu setzen und töten Verbindungen oder setzen die Datenbank im Einzelbenutzermodus. gibt es so etwas? Oder muss ich zu SMO wechseln, um etwas komplizierteres als eine grundlegende Wiederherstellung zu tun?

Ich verwende jetzt eine Problemumgehung der Verwendung von SMO-API, um die DB zuerst zu löschen, würde aber gerne diese vereinfachen, wenn es möglich ist.

+0

Danke für die handliche PS ausführen :) geholfen! –

Antwort

0

Setzen Sie die Datenbank auf single user mode und führen Sie alle vorhandenen Transaktionen zurück. Das ist wie so mit einer Tsql Aussage gemacht,

ALTER DATABASE MyDatabase SET SINGLE_USER WITH ROLLBACK IMMEDIATE; 

Wie Sie bereits auf sie sind, warum nicht von der Datenbank loszuwerden, bevor Sie die Wiederherstellung?

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

Ein weiterer Ansatz ist mit der Verwendung der WITH REPLACE Option restore the database.

+0

Ich suchte nach einer Powershell-Lösung, die keine SQL-Skripte enthielt. Ich habe bereits eine, die funktioniert, aber es muss DB fallen - siehe in meiner Frage oben. Aber ich dachte, dass nur das Cmdlet "Restore-SqlDatabase" mit einigen Flags funktionieren wird, über die ich nicht weiß. – lahsrah

0

Es:

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 

Sie weitere Informationen über die Verwendung von Invoke-Sqlcmd finden Sie hier ist kein Argument in Restore-SqlDatabase, um alle Prozesse zu beenden, die die Datenbank verwenden, die Sie wiederherstellen möchten.

Sie können das Skript unten für eine vollständige Dokumentation der Argumente in Wiederherstellen-SQLDatabase

get-help Restore-SqlDatabase -full 
Verwandte Themen