it-swarm.com.de

So löschen Sie die Datenbank im Single_User-Modus

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

Wenn ich versuche, es zu löschen, wird folgende Fehlermeldung angezeigt:

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

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

Ich habe versucht, das unten stehende ALTER auszuführen und habe immer noch das gleiche Problem.

ALTER DATABASE [DatabaseName] SET MULTI_USER WITH NO_WAIT
12

Wenn Sie eine Datenbank löschen möchten, müssen Sie die einzige Verbindung zu dieser Datenbank sein. Wenn andere Verbindungen vorhanden sind, können Sie diese nicht trennen. Aus 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, das Löschen durchzuführen, aber entweder Sie schnappte sich eine Verbindung, von der Sie nichts wussten oder die ein anderer Prozess hat. Die Tatsache, dass der Neustart von SSMS für Sie funktioniert hat, zeigt mir, dass Sie wahrscheinlich diese Verbindung hergestellt haben. Hier erfahren Sie, wie Sie das beheben können.

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

Im Code erfahren Sie hier, wie Sie dies tun müssen (schließen Sie jedoch zuerst Ihre 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
23
Mike Walsh

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' können derzeit nicht vorgenommen werden. Die Datenbank befindet sich im Einzelbenutzermodus und ein Benutzer ist derzeit mit ihr verbunden. Meldung 5069, Ebene 16, Status 1, Zeile 1 ALTER DATABASE-Anweisung fehlgeschlagen.

Das folgende Abfrage beendet die Prozesse, 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

Dann sollten Sie in der Lage sein, die Datenbank wie gewohnt wieder in den Mehrbenutzermodus zu versetzen:

ALTER DATABASE 'DatabaseName' SET MULTI_USER
13
Maxim Paukov