選択したデータベースまたはサーバーへのすべての接続を強制終了するストアドプロシージャ
選択したデータベースまたはサーバーへのすべての接続を、それを呼び出すプロセスを除いて強制終了するSQLストアドプロシージャ。
前書き
データベースからすべてのユーザーを切断する必要がある場合があります。1つの例はログ配布レプリケーションです。以下のコードは、復元タスクによってデータベースを排他モードで開く必要があるため、20分ごとに更新されるレポートサーバーで使用されました。
以下のコードはデータベース名を受け入れるため、一度だけ記述して、マスターデータベースまたはユーティリティ(作成している場合)データベースに保存する必要があります。その後、他のプロセスから呼び出すことができます。この場合、上記のドキュメントの完全なメンテナンスプランです。
これは非常に単純なストアドプロシージャであり、アクティブな接続のリストを取得し、各接続をループしてプロセスと接続を強制終了します。
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