還原數據庫要求獨占訪問,若有任何會話(含當前操作者)連接目標庫,將報錯:無法獲得對數據庫的獨占訪問權。本文提供從「圖形界面」到「腳本殺進程」的三級方案。
System.Data.SqlClient.SqlError: 因為數據庫正在使用...。服務管理器或 net stop MSSQLSERVER && net start MSSQLSERVER。所有連接瞬間斷開,適合維護窗口期。
USE master;
GO
DECLARE @dbname SYSNAME = 'YourDB';
DECLARE @spid SMALLINT;
DECLARE @sql NVARCHAR(MAX);
-- 游標遍歷 sys.sysprocesses(舊版)或 sys.dm_exec_sessions(新版)
DECLARE cur CURSOR LOCAL FAST_FORWARD FOR
SELECT session_id
FROM sys.dm_exec_sessions
WHERE database_id = DB_ID(@dbname)
AND session_id <> @@SPID; -- 排除自己
OPEN cur;
FETCH NEXT FROM cur INTO @spid;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = N'KILL ' + CAST(@spid AS VARCHAR(5));
EXEC (@sql);
FETCH NEXT FROM cur INTO @spid;
END
CLOSE cur;
DEALLOCATE cur;
GO
-- 立即設為單用戶並回滾未提交事務
ALTER DATABASE [YourDB] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
-- 執行還原 ...
-- 還原後恢復多用戶
ALTER DATABASE [YourDB] SET MULTI_USER;
GO
ALTER DATABASE [YourDB] SET OFFLINE WITH ROLLBACK IMMEDIATE;
GO
-- 還原
RESTORE DATABASE [YourDB] ...;
GO
ALTER DATABASE [YourDB] SET ONLINE;
GO
優勢:單條語句完成斷連+回滾,無需游標循環,且不受「鎖定系統表」限制。