Close existing Connections by SQL Script

8. Juli 2015

Beim Löschen einer Datenbank kann man “close existing connections” auswählen. Beim Restore oder Detach kann man es leider nicht, hier bekommt man nach längerem Warten eine Fehlermeldung.

Die wohl bekannteste Möglichkeit Verbindungen zuschließen bietet der Activity Monitor. Hier sieht man alle Prozesse, diese kann man filtern und den gewünschten schließen. Leider nur einen Prozess nach dem anderen. Bei zu vielen Prozessen braucht man unter Umständen recht lange und läuft Gefahr dass in der Zwischenzeit wieder neue Verbindungen erstellt wurden.

ActivityMon1

ActivityMon2

Man kann aber auch per Script alle Verbindungen außer der eigenen schließen, indem man KILL verwendet:

   1: DECLARE @dbName AS VARCHAR(200) = 'xyz'; -- DB_NAME()

   2:  

   3: DECLARE @kill AS VARCHAR(max) = '';

   4: SELECT @kill = @kill + 'KILL ' + STR([SPID]) + ';'

   5: FROM master..sysprocesses 

   6: WHERE [DBID] = DB_ID(@dbName)

   7: AND [SPID] <> @@SPID;

   8:  

   9: EXEC(@kill);

Leider erlebe ich es oft, dass die Testumgebung blockiert ist und ein Update auf eine neue Version verhindert. Dann kommt man leider nicht dran vorbei alle Verbindungen zu schließen.

 

Ich persönlich lege solche Scripte ungern in der Datenbank ab, da sie meist in Produktion nicht benötigt werden. Besser finde ich es sie als Toolset zu sammeln. Dies kann man zusammen mit den Sourcen des Projektes oder als Teil des Projektes einchecken.