Stellen Sie sicher, dass Sie keine Abhängigkeiten wie Datenbank-Snapshots von der Datenbank haben, die Sie entfernen möchten. Die Fehlermeldung würde jedoch anders aussehen. Sind Sie sicher, dass es keinen versteckten Prozess gibt, der eine Verbindung zu Ihrer Datenbank herstellt? Ein guter Ansatz wäre, ein Skript auszuführen, das alle Sitzungen beendet und die Datenbank sofort nach dem Umbenennen in einen anderen Namen umbenennt und die Datenbank dann löscht.
Erstellen Sie einen Cursor basierend auf dieser Auswahl:
select d.name , convert (smallint, req_spid) As spid
from master.dbo.syslockinfo l,
master.dbo.spt_values v,
master.dbo.spt_values x,
master.dbo.spt_values u,
master.dbo.sysdatabases d
where l.rsc_type = v.number
and v.type = 'LR'
and l.req_status = x.number
and x.type = 'LS'
and l.req_mode + 1 = u.number
and u.type = 'L'
and l.rsc_dbid = d.dbid
and rsc_dbid = (select top 1 dbid from
master..sysdatabases
where name like 'my_db')
Ausgabe innerhalb des Cursors:
SET @kill_process = 'KILL ' + @spid
EXEC master.dbo.sp_executesql @kill_process
PRINT 'killed spid : '+ @spid
Nachdem der Cursor geschlossen und freigegeben wurde:
sp_dboption 'my_db', 'single user', 'TRUE'
go
sp_renamedb 'my_db', 'my_db_old'
go
DROP DATABASE MY_DB_OLD
Eine Sitzung, die mit einer anderen Datenbank verbunden ist, hat möglicherweise eine offene Transaktion, die sich auch auf Ihre Datenbank auswirkt - sp_who2 zeigt nur eine Datenbank an. Es könnte auch so einfach sein, dass der Objekt-Explorer oder die Objekt-Explorer-Details in SSMS geöffnet werden, wodurch wiederum nur eine Datenbank in sp_who2 angezeigt wird.
Versuchen Sie nicht , die verantwortliche Sitzung zu finden . Töte sie einfach alle mit einer Anweisung (und stelle sicher, dass nicht deine SSMS-Kopie verbunden ist, z. B. ein anderes Abfragefenster, Objekt-Explorer usw.):
Jetzt können Sie es löschen und dies mit DDL und nicht mit der Benutzeroberfläche tun:
quelle
USE master
dann nur nochDROP DATABASE dbname
. Anscheinend ist alles, was benötigt wird, etwas anderes zu "benutzen", um die Datenbank freizugeben.Was ist Ihre aktuelle Datenbank, wenn Sie den
DROP
Befehl ausgeben ? Versuche dies:Stellen Sie außerdem sicher, dass Sie mit der Datenbank verbunden sind
sa
und nichtdbo
mit der Datenbank, die Sie löschen möchten.quelle
Wie wäre es, wenn Sie nur sehen, was SSMS tut, wenn Sie die Benutzeroberfläche verwenden, diese aber anweisen, ein Skript für die Aktion auszugeben? So funktioniert SSMS, wenn Sie mit der rechten Maustaste auf die Datenbank klicken und Löschen auswählen und dann das Kontrollkästchen aktivieren, um vorhandene Verbindungen zu schließen:
quelle
Ich habe mich dieser Situation viele Male gestellt und mache folgendes:
Wenn offensichtliche Methoden nicht funktionieren ... (genau wie in Ihrer Situation):
Ermitteln Sie die Datenbank-ID aus sysdatabases.
Dann ausführen -
sp_lock
das zeigt alle Sperren für die Instanz zusammen mit spid und dbid.Töten Sie die Spids mit dem dbid, das Sie offline schalten oder löschen möchten.
Obwohl der Prozess ein bisschen manuell ist, kann er wie folgt automatisiert werden:
quelle
Auf StackOverflow wurde eine wirklich einfache Antwort gefunden, die bei mir zum ersten Mal funktioniert hat:
https://stackoverflow.com/a/7469167/261405
Hier ist die SQL aus dieser Antwort:
quelle