So legen Sie eine Datenbank im Single_User-Modus ab


12

Wie lösche ich eine Datenbank, DatabaseName (Single User)deren Name angezeigt wird?

Wenn ich versuche, es zu löschen, erhalte ich die folgende Fehlermeldung:

Änderung für Datenbank 'DatabaseName' fehlgeschlagen. (Microsoft.SqlServer.Smo)

ALTER DATABASE-Anweisung fehlgeschlagen. (Microsoft SQL Server, Fehler: 5064)

Ich habe versucht, das ALTERFolgende auszuführen und habe immer noch das gleiche Problem.

ALTER DATABASE [DatabaseName] SET MULTI_USER WITH NO_WAIT

Antworten:


23

Wenn Sie eine Datenbank löschen, müssen Sie die einzige Verbindung zu dieser Datenbank sein. Wenn andere Verbindungen vorhanden sind, können Sie sie nicht löschen. Aufgrund der Fehlermeldung (dieser Fehler bedeutet, dass sich Ihre Datenbank im Single_User-Modus befindet, aber bereits eine Verbindung besteht, sodass Sie keine Verbindung herstellen können) gehe ich davon aus, dass Sie versucht haben, sie in den Single_User-Modus zu versetzen, und dann versucht haben, die Löschung durchzuführen, aber entweder Sie hat sich eine Verbindung geholt, von der Sie nichts wussten oder die ein anderer Prozess hat. Die Tatsache, dass der Neustart von SSMS für Sie funktioniert hat, sagt mir, dass Sie wahrscheinlich diese Verbindung ergriffen haben. Also hier ist, wie Sie das beheben können.

Logischerweise müssen Sie die Datenbank wieder in den Multi-User-Modus versetzen, damit Sie sie wieder in den Single-User-Modus versetzen können (diesmal haben Sie jedoch die Kontrolle über diese einzelne Verbindung und löschen die Datenbank, bevor eine andere Verbindung hergestellt wird) weg sein.

Im folgenden Code wird beschrieben, wie Sie dies tun müssen ( schließen Sie jedoch zuerst die Abfragefenster, die mit dieser Datenbank verbunden sind. Starten Sie SSMS neu und stellen Sie sicher, dass Sie diese Datenbank nicht im Objektbrowser auswählen ):

-- Then attempt to take your database to multi_user mode, do this from master
USE MASTER 
GO

ALTER DATABASE myDatabaseName 
SET multi_user WITH ROLLBACK IMMEDIATE
GO

-- Now put it into single_user mode and drop it. Use Rollback Immediate to disconnect any sessions and rollback their transactions. Safe since you are about to drop the DB.
ALTER DATABASE myDatabaseName
SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO

DROP DATABASE myDatabaseName
GO

Diese Lösung funktioniert nicht, wenn sich die Datenbank bereits im Einzelbenutzermodus befindet und Sie versuchen, über eine andere Verbindung darauf zuzugreifen.
Maxim Paukov

4
Das ist richtig, Maxim - Deshalb habe ich gesagt, dass meine Annahme hier basierend auf den bereitgestellten Informationen und der OPs-Selbstantwort tatsächlich die mit der offenen Verbindung ist, wahrscheinlich über den Objekt-Explorer oder ein Abfragefenster ... Wenn sie von einigen auf eine andere Weise geöffnet wurde anderen Benutzer, dann müssten Sie feststellen, dass eine Verbindung, die die einzelne Verbindung gestohlen hat, zulässig ist, und dann die Sitzung dieser Verbindung beenden und die oben beschriebenen Schritte ausführen.
Mike Walsh

13

Wenn Sie versuchen, auf die Datenbank zuzugreifen, die sich bereits im Einzelbenutzermodus befindet, müssen Sie zuerst alle Verbindungen zur Datenbank schließen. Andernfalls wird eine Fehlermeldung angezeigt:

Meldung 5064, Ebene 16, Status 1, Zeile 1 Änderungen am Status oder an den Optionen der Datenbank 'DatabaseName' sind derzeit nicht möglich. Die Datenbank befindet sich im Einzelbenutzermodus und ein Benutzer ist derzeit mit ihr verbunden. Meldung 5069, Ebene 16, Status 1, Zeile 1 Die Anweisung ALTER DATABASE ist fehlgeschlagen.

Die folgende Abfrage bricht die Prozesse ab, die auf die Datenbank zugreifen:

-- Create the sql to kill the active database connections  
declare @execSql varchar(1000), @databaseName varchar(100)  
-- Set the database name for which to kill the connections  
set @databaseName = 'DatabaseName'  

set @execSql = ''   
select  @execSql = @execSql + 'kill ' + convert(char(10), spid) + ' '  
from    master.dbo.sysprocesses  
where   db_name(dbid) = @databaseName  
     and  
     DBID <> 0  
     and  
     spid <> @@spid  
exec(@execSql)
GO

Anschließend sollten Sie die Datenbank wie gewohnt wieder in den Mehrbenutzermodus versetzen können:

ALTER DATABASE 'DatabaseName' SET MULTI_USER

2
Dies ist eine sehr, sehr umständliche Lösung und entspricht einem frustrierenden Schlagabtausch auf einem geschäftigen System. Um alle Benutzer rauszuschmeißen, viel einfacher zu bedienen, ALTER DATABASE SET SINGLE_USER WITH ROLLBACK IMMEDIATEwie Mikes Antwort zeigt.
Aaron Bertrand

1
Die Lösung von @AaronBertrand Mike funktioniert nicht, wenn sich die Datenbank bereits im Einzelbenutzermodus befindet und Sie versuchen, über eine andere Verbindung darauf zuzugreifen.
Maxim Paukov

2
Richtig, wenn das der Fall ist, müsste er die Sitzungen finden, wie Sie beschrieben haben. Wenn die Verbindung, mit der die Datenbank auf single_user gesetzt wurde, seine eigene ist ...
Aaron Bertrand
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.