首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 單用戶模式強制切回多用戶模式:KILL 佔用連線腳本

     編輯:關於SqlServer

問題場景

資料庫復原/還原/複製操作中斷,導致資料庫卡在 SINGLE_USER 模式 (SSMS 物件總管顯示「單一使用者」),無法建立新連線。需先終止現有佔用連線,再切回 MULTI_USER。

標準解決腳本

USE master;
GO

-- 1. 宣告動態 SQL 變數
DECLARE @sql NVARCHAR(MAX) = N'';

-- 2. 產生 KILL 指令針對目標資料庫的所有 SPID
-- 注意:sys.sysprocesses 為相容性檢視,新版建議用 sys.dm_exec_sessions
SELECT @sql = @sql + N'; KILL ' + CAST(spid AS NVARCHAR(10))
FROM sys.sysprocesses
WHERE dbid = DB_ID(N'YourDatabaseName');  -- ← 修改為實際資料庫名稱

-- 3. 執行批次 KILL
EXEC sp_executesql @sql;
GO

-- 4. 切換回多用戶模式
ALTER DATABASE [YourDatabaseName] SET MULTI_USER WITH ROLLBACK IMMEDIATE;
GO

關鍵點說明

  • WITH ROLLBACK IMMEDIATE:確保若有殘留交易立即回滾,強制完成模式切換。
  • sys.dm_exec_sessions 現代寫法 (SQL 2005+):
    SELECT @sql = @sql + N'; KILL ' + CAST(session_id AS NVARCHAR(10))
    FROM sys.dm_exec_sessions
    WHERE database_id = DB_ID(N'YourDatabaseName')
      AND is_user_process = 1;
  • 執行此腳本需 **sysadmin** 或 **ALTER ANY CONNECTION** 權限。

進階:封裝為預存程序

CREATE PROC dbo.usp_ForceMultiUser @dbname SYSNAME
WITH EXECUTE AS OWNER
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @sql NVARCHAR(MAX) = N'';
    SELECT @sql = @sql + N'; KILL ' + CAST(session_id AS NVARCHAR(10))
    FROM sys.dm_exec_sessions
    WHERE database_id = DB_ID(@dbname) AND is_user_process = 1;
    IF @sql <> N'' EXEC sp_executesql @sql;
    EXEC (N'ALTER DATABASE ' + QUOTENAME(@dbname) + N' SET MULTI_USER WITH ROLLBACK IMMEDIATE');
END;

使用:EXEC usp_ForceMultiUser 'YourDatabaseName';

預防建議

  • 資料庫維護作業 (備份、DBCC、索引重建) 盡可能在 **MULTI_USER** 下執行,或使用 `WITH ROLLBACK IMMEDIATE` 明確指定等待行為。
  • 監控 `sys.databases.user_access_desc` 異常變更,設定告警。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved