問題描述
今天在SQL Server刪除一個數據庫的時候報錯,內容如下:
消息 3702,級別 16 無法刪除數據庫 “TestDB”,因為該數據庫當前正在使用。
我的SQL原語句是這樣的
USE [master] GO DROP DATABASE [TestDB] GO
上網搜了一下,找到了解決辦法,也在這里記錄一下。
解決方案
有時候我們想用DROP DATABASE語句刪除數據庫和數據庫文件,會刪不掉,因為有其他人正在使用要刪除的數據庫,這里有一個方法可以強制斷開其它數據庫連接,再刪除數據庫。
網上有很多是說要將數據庫回滾到原始配置狀態的解決方案的文章,例如:
原文鏈接:http://www.2cto.com/database/201210/160122.html
刪除數據庫時提示數據庫正在被使用,無法刪除(Cannot drop database databasename because it is currently in use)的問題
刪除數據庫時提示數據庫正在被使用,無法刪除(Cannot drop database databasename because it is currently in use)
這是因為在操作數據庫中出現了問題,比如連接數據庫后,打開了數據庫連接,用完后沒有正確關閉,這時就可能會導致這種情況出現。
那么現在給出解決方案: www.2cto.com
use master
go
alter database database_name set single_user with rollback immediate
--將數據庫回滾到原始配置狀態
go
drop database database_name--刪除數據庫
go
注:database_name為要刪除的數據庫名稱。
我用的是sqlserver2008 ,可以解決問題
出處:https://blog.csdn.net/home_zhang/article/details/37690005
我們就來研究下,假如我們要刪除的數據庫是[TestDB],我們可以用下面的語句:
USE [master]--注意不能夠USE [TestDB],因為[TestDB]即將被刪除,所以不能夠將當前連接設置為連接到[TestDB],否則下面的DROP DATABASE語句會報錯 GO ALTER DATABASE [TestDB] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;--首先將數據庫改為單用戶模式,WITH ROLLBACK IMMEDIATE提示切斷所有其它連接到[TestDB]的數據庫連接 GO DROP DATABASE [TestDB];--刪除[TestDB]及其數據庫文件 GO
所以這個方法的核心就是先更改數據庫模式為單用戶模式"SINGLE_USER",那么什么是數據庫的單用戶模式呢?我這里貼出一個從網上找到的解釋:
So in single_user mode - you would be quite unlikely to have locking problems in that database. It is what it sounds like - single user - and it doesn't mean Single Username - it means one user. So it's used when you as a DBA want to do something that can't be done with others users in. Maybe you are trying to do a repair option of a checkdb. Maybe you are trying to change some object metadata and don't have a better way to kick other users out. Etc.
上面的解釋來自:What happens when SQL Server is in Single User Mode?
所以數據庫單用戶模式"SINGLE_USER",是指只能有一個用戶連接能夠連接到數據庫,這樣我們就可以在沒有其它數據庫連接的情況下,執行DROP DATABASE語句來刪除數據庫和其數據庫文件了。