Teilweise ist es nicht möglich die Datenbank in den SINGLE_USER Modus zu schalten, beispielsweise weil die Datenbank in einer Always On AG läuft oder es sich um eine Azure SQL Database handelt. In solchen Fällen kann es manchmal notwendig oder praktisch sein alle User Sessions mit dem KILL Befehl zu beenden, beispielsweise um eine Datenbank umzukonfigurieren oder ein Login zu löschen.
Das folgende Scripts beendet alle User Sessions innerhalb der aktuellen Datenbank, außer den Sessions, welche zu dem eigenen User gehören:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
-- KILL ALL USER SESSIONS SET NOCOUNT ON; DECLARE @session_id_to_kill INT; DECLARE @killstmt NVARCHAR(4000); DECLARE session_cursor CURSOR FOR SELECT session_id FROM sys.dm_exec_sessions WHERE security_id <> 0x01 AND database_id=DB_ID() AND group_id<>2 AND login_name <> SUSER_SNAME() OPEN session_cursor FETCH NEXT FROM session_cursor INTO @session_id_to_kill WHILE @@FETCH_STATUS = 0 BEGIN SET @killstmt = N'KILL ' + CAST(@session_id_to_kill AS NVARCHAR(100)); EXEC sp_executesql @killstmt; FETCH NEXT FROM session_cursor INTO @session_id_to_kill END CLOSE session_cursor; DEALLOCATE session_cursor; |
Das Script lässt sich dabei leicht anpassen, um beispielsweise nur Sessions auf dem Server zu beenden. Praktisch kann dies auch vor dem zurücksetzen auf einen Snapshot sein, falls noch Sessions zu dem entsprechenden Datenbank Snapshot offen sind.
Hierbei muss nur das SELECT entsprechend angepasst werden. Das folgende SELECT beendet alle Sessions in der aktuellen Datenbank, bis auf die eigene:
1 2 |
SELECT session_id FROM sys.dm_exec_sessions WHERE security_id <> 0x01 AND database_id=DB_ID() AND group_id<>2 AND session_id<>@@SPID |
Läuft innerhalb einer Session eine Transaktion, wird diese entsprechend zurückgerollt.