嘗試卸載資料庫時,發生資料庫正在使用的而無法卸載的可能解決方案

問題

不管在 SSMS或AP中嘗試要卸載DB出現 :
發生【無法卸離 資料庫 '資料庫名稱',因為目前正在使用中】的錯誤

解法
Step1:先查詢哪些DB目前使用(連線)中

         E
xec sp_who

         EXEC sys.sp_who2

Step2

             A : 
 kill  還連線到所要卸載的資料庫的 SPID 

KILL 53;  
GO  

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

?
1
2
3
4
5
6
USE master
GO
ALTER DATABASE [資料庫名稱]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE;
GO

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


以下是 SQL Server 2005 版本

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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 通用的版本
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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

             B:
先切換到其他資料庫(像是master)之後再進行卸離

--4.設定資料庫為SINGLE_USER模式
ALTER DATABASE [MyDB] SET  SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
--4.1 先將資料庫切換到非要卸離的資料庫
USE master
GO
--5.卸載資料庫
EXEC master.dbo.sp_detach_db @dbname = N'
     
參考:
https://support.microsoft.com/zh-tw/kb/2731348

留言

這個網誌中的熱門文章

ASP.NET常用的RegularExpressionValidator驗證

PMP常用的英文單字