Seçilen veritabanı veya sunucuya giden tüm bağlantıları sonlandırmak için Depolanan Prosedür
Çağıran işlem haricinde, seçilen veritabanı veya sunucuya giden tüm bağlantıları sonlandırmak için SQL Stored Procedure.
Giriş
Veritabanınızdan tüm kullanıcıların bağlantısını kesmeniz gereken zamanlar olabilir, bunun bir örneği Günlük Gönderimi çoğaltmasıdır. Aşağıdaki kod, veritabanının geri yükleme görevi tarafından özel modda açılması gerektiğinden, her 20 dakikada bir güncellenen bir raporlama sunucusunda kullanılmıştır.
Aşağıdaki kod bir veritabanı adını kabul eder, bu nedenle yalnızca bir kez yazılması ve ana veya yardımcı programlarda (bir tane oluşturduysanız) veritabanında saklanması gerekir. Daha sonra, başka herhangi bir işlemden, bizim durumumuzda bunun yukarısındaki belgedeki eksiksiz bakım planı çağrılabilir.
İşlemi ve bağlantıyı sonlandıran her biri üzerinden aktif bağlantıların ve döngülerin bir listesini alan oldukça basit bir saklı yordamdır.
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