萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

SQL Server 終止用戶進程進階存儲過程:批量、範圍、按資料庫

痛點

原生 KILL spid 單次只能結束一個會話,批量清理極其繁瑣。

通用殺進程存儲過程:kill2

部署於 master 資料庫,支援四種模式:

模式一:單一 SPID

EXEC kill2 '58';

模式二:連續範圍

EXEC kill2 '51-57';  -- 結束 51 到 57 所有存在的 SPID

模式三:離散列表

EXEC kill2 '51,56,100,58';

模式四:按資料庫殺掉所有連接

EXEC kill2 'DB=MyDatabase';

核心代碼邏輯

CREATE PROCEDURE kill2 @param VARCHAR(500)
AS
BEGIN
    SET @param = REPLACE(@param, ' ', '');
    
    -- 範圍模式: 含 '-'
    IF CHARINDEX('-', @param) > 0
        -- 解析起止,循環 KILL 存在且 > 50 的 SPID (排除系統進程)
    
    -- 列表模式: 含 ','
    IF CHARINDEX(',', @param) > 0
        -- 分割循環 KILL
    
    -- 資料庫模式: 含 '='
    IF CHARINDEX('=', @param) > 0
        -- 解析 DB 名,游標遍歷 sysprocesses 該 DB 的 SPID 並 KILL
    
    -- 單一 SPID
    IF ... -- 無上述符號
        -- 直接 KILL
END

部署與使用

USE master;
GO
-- 執行上述 CREATE PROCEDURE 腳本
-- 測試
EXEC kill2 '51-55';
EXEC kill2 'DB=TestDB';

安全防護

  • **僅限 sysadmin / securityadmin 執行**
  • 內建 spid > 50 過濾,保護系統進程 (1-50 通常為系統)
  • 不存在的 SPID 僅列印警告,不報錯中斷
  • 生產環境建議加入「雙人授權」或審計日誌

現代替代方案 (SQL Server 2017+)

-- 結束資料庫所有連接 (單條語句)
ALTER DATABASE [MyDatabase] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
ALTER DATABASE [MyDatabase] SET MULTI_USER;

此法更簡潔,但會強制斷開**所有**連接(含正在執行的查詢),使用前務必評估影響。

總結

kill2 適合精細控制(特定 SPID/範圍/列表);SET SINGLE_USER 適合「必須獨佔資料庫」場景(還原/結構變更/離線維護)。**按需選擇,謹慎執行。**

copyright © 萬盛學電腦網 all rights reserved