Ab und zu steht man vor der Herausforderung eine SQL-Datenbank wiederherzustellen oder sonstwie zurück zu setzen. Dann wird man schnell mit dem Problem konfrontiert, dass offene Verbindung zur Datenbank diese Aufgabe verhindern.
Nun kann man entweder mit den üblichen Tools, wie dem SQL-Management-Studio, die Verbindungen trennen, oder man bastelt sich dazu ein kleines Skript. Da ich selber hauptsächlich skriptbasiert arbeite, habe ich dafür folgenden Algorithmus entwickelt:
USE master DECLARE @databaseName VARCHAR(15) SET @databaseName = 'name_of_your_database' DECLARE @kill_id INT DECLARE @disconnectQuery NVARCHAR(255) DECLARE killprocess_cursor CURSOR FOR SELECT a.spid FROM sysprocesses a JOIN sysdatabases b ON a.dbid = b.dbid WHERE b.name = @databaseName OPEN killprocess_cursor FETCH NEXT FROM killprocess_cursor INTO @kill_id WHILE @@FETCH_STATUS = 0 BEGIN SET @disconnectQuery = 'KILL '+ CONVERT(VARCHAR, @kill_id) RAISERROR ('EXECUTING: %s', 1, 1, @disconnectQuery) WITH NOWAIT EXEC (@disconnectQuery) FETCH NEXT FROM killprocess_cursor INTO @kill_id END CLOSE killprocess_cursor DEALLOCATE killprocess_cursor
Das Skript durchläuft mit einem Cursor sämtliche offenen Prozesse der festgelegten Datenbank und schließt diese mit Hilfe des „Kill“-Befehls und der zugehörigen Prozess-Id.