搜尋本站文章

2008-01-04

刪除所有連線; Kill All Connection



若是要刪除指定資料庫上的所有連線,可以使用以下方式:

SINGLE_USER 引數
指定每次只能有一位使用者存取資料庫。
如果指定了 SINGLE_USER,且沒有其他使用者連接到資料庫,就會封鎖 ALTER DATABASE 陳述式,直到所有使用者都中斷指定的資料庫為止。

資料庫會保留在 SINGLE_USER 模式中,即使是將選項記錄設為關閉的使用者也是如此。
此時其他使用者可以連接到這個資料庫,但只能有一位。

WITH ROLLBACK IMMEDIATE 引數
使用終止選項。所有未完成的交易都會回復,與指定資料庫的所有連接都會立即中斷。

若是要刪除指定資料庫上的所有連線,請參考以下的範例:


USE master
GO
ALTER DATABASE [資料庫名稱]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE;
GO


若是要刪除 SQL Server 上全部的連線,可以使用以下的範例,並且保留本身這條連線不會刪除。



以下是 SQL Server 2005 版本

USE master
GO
CREATE PROC KillUserConnections
AS
DECLARE @spid int, @SQLstr nvarchar(128)

DECLARE spids_cr CURSOR FOR
SELECT session_id FROM sys.dm_exec_connections
WHERE session_id<>@@SPID
FOR READ ONLY

OPEN spids_cr

FETCH spids_cr INTO @spid

WHILE (@@FETCH_STATUS=0)
BEGIN
SET @SQLstr = 'KILL ' + CAST(@spid AS varchar)
EXEC sp_executesql @SQLstr
FETCH spids_cr INTO @spid
END

CLOSE spids_cr
DEALLOCATE spids_cr

GO

-- 檢視 SQL Server 目前所有的連線 session ;所有目前的處理序
SELECT * FROM sys.dm_exec_connections

-- 刪除所有的處理序、連線、session
EXEC KillUserConnections

-- 再度檢視 SQL Server 目前所有的連線 session ;所有目前的處理序
SELECT * FROM sys.dm_exec_connections



以下是 SQL Server 2000 與 2005 通用的版本

USE master
GO
CREATE PROC KillUserConnections
AS
DECLARE @spid int, @SQLstr nvarchar(128)

DECLARE spids_cr CURSOR FOR
SELECT spid
FROM master..sysprocesses
WHERE spid<>@@SPID AND net_address<>''
FOR READ ONLY

OPEN spids_cr

FETCH spids_cr INTO @spid

WHILE (@@FETCH_STATUS=0)
BEGIN
SET @SQLstr = 'KILL ' + CAST(@spid AS varchar)
EXEC sp_executesql @SQLstr
FETCH spids_cr INTO @spid
END

CLOSE spids_cr
DEALLOCATE spids_cr

GO

-- 檢視 SQL Server 目前所有的連線 session ;所有目前的處理序
EXEC sp_who2

-- 刪除所有的處理序、連線、session
EXEC KillUserConnections

-- 再度檢視 SQL Server 目前所有的連線 session ;所有目前的處理序
EXEC sp_who2


其中 sysprocesses 此為 SQL Server 2000 系統資料表。


還有其他方法嗎?
1. 停止 SQL Server ? 呵呵...這應該不是好方法。
2. 中斷伺服器的網路連線。
3. 啟用防火牆。
...等等