Uložená procedura zabije všechna připojení k vybrané databázi nebo serveru
Procedura SQL Stored zabije všechna připojení k vybrané databázi nebo serveru s výjimkou procesu, který ji volá.
Úvod
Mohou nastat situace, kdy potřebujete odpojit všechny uživatele od vaší databáze, jedním příkladem je replikace protokolu. Tento kód níže byl použit na serveru sestav, který byl aktualizován každých 20 minut, protože databázi je třeba otevřít ve výhradním režimu pomocí úlohy obnovení.
Níže uvedený kód přijme název databáze, takže je třeba jej napsat pouze jednou a uložit jej do hlavní databáze nebo databáze obslužných programů (pokud jste ji vytvořili). Poté jej lze vyvolat z jakéhokoli jiného procesu, v našem případě z úplného plánu údržby v dokumentu nad tímto.
Jedná se o poměrně jednoduchou uloženou proceduru, která jednoduše získá seznam aktivních připojení a smyček, které zabijí proces a připojení.
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