Gespeicherte Prozedur zum Beenden aller Verbindungen zur ausgewählten Datenbank oder zum ausgewählten Server
Einführung
Es kann vorkommen, dass Sie alle Benutzer von Ihrer Datenbank trennen müssen. Ein Beispiel ist die Replikation von Protokollversand. Der folgende Code wurde auf einem Berichtsserver verwendet, der alle 20 Minuten aktualisiert wurde, da die Datenbank von der Wiederherstellungsaufgabe im exklusiven Modus geöffnet werden muss.
Der folgende Code akzeptiert einen Datenbanknamen, sodass er nur einmal geschrieben und in der Master- oder Dienstprogrammdatenbank (falls Sie eine erstellt haben) gespeichert werden muss. Es kann dann von jedem anderen Prozess aus aufgerufen werden, in unserem Fall vom vollständigen Wartungsplan im obigen Dokument.
Es ist eine ziemlich einfache gespeicherte Prozedur, die einfach eine Liste der aktiven Verbindungen abruft und jede durchläuft, um den Prozess und die Verbindung zu beenden.
SQL Code
CREATE PROC maint.KillConnections(@database VARCHAR(50)) AS BEGIN
SET NOCOUNT ON;
DECLARE @spid INT
DECLARE @killstatement NVARCHAR(10)--Declare a cursor to select the users connected to the specified database
DECLARE c1 CURSOR FAST_FORWARD FOR SELECT request_session_id
FROM sys.dm_tran_locks
WHERE resource_type='DATABASE'
AND (DB_NAME(resource_database_id)=@database OR @database IS NULL)
OPEN c1
FETCH c1 INTO @spid
WHILE @@FETCH_STATUS= 0 BEGIN
IF @@SPID<>@spid--Don't kill the connection of the user executing this statement
BEGIN
-- Construct dynamic sql to kill spid
SET @killstatement ='KILL '+CAST(@spid AS VARCHAR(5))
EXEC sp_executesql @killstatement
PRINT @spid -- Print killed spid
END
FETCH NEXT FROM c1 INTO @spid
END
-- Clean up
CLOSE c1
DEALLOCATE c1
END
GO