无法删除数据库,因为它正在使用中。

159

我想删除一个数据库。我已经使用了下面的代码,但是没有成功。

public void DropDataBase(string DBName,SqlConnection scon)
{
    try
    {
        SqlConnection.ClearAllPools();
        SqlCommand cmd = new SqlCommand("ALTER DATABASE " + DBName + "     SET SINGLE_USER     WITH ROLLBACK IMMEDIATE", scon);
        cmd.CommandType = CommandType.Text;
        scon.Open();
        cmd.ExecuteNonQuery();
        scon.Close();

        SqlCommand cmddrpdb = new SqlCommand("drop database " + DBName + "", scon);
        cmddrpdb.CommandType = CommandType.Text;
        scon.Open();
        cmddrpdb.ExecuteNonQuery();
        scon.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show("DropDataBase : " +ex.Message);
    }
}

我遇到了错误:无法删除数据库,因为它正在使用中。请帮我解决上述问题。

21个回答

163
在删除数据库之前,您需要先删除所有连接到目标数据库的连接。我在 http://www.kodyaz.com/articles/kill-all-processes-of-a-database.aspx 找到了一个解决方案。
DECLARE @DatabaseName nvarchar(50)
SET @DatabaseName = N'YOUR_DABASE_NAME'

DECLARE @SQL varchar(max)

SELECT @SQL = COALESCE(@SQL,'') + 'Kill ' + Convert(varchar, SPId) + ';'
FROM MASTER..SysProcesses
WHERE DBId = DB_ID(@DatabaseName) AND SPId <> @@SPId

--SELECT @SQL 
EXEC(@SQL)

3
+1 我想知道为什么你之前没有理解这个,这是一个非常方便的答案。谢谢。 - Mehdi LAMRANI
那不会带来非用户进程吗? - monksy
对我来说,我遇到了“KILL命令不能在用户事务内使用”的错误。 - Ally
如果交易出现问题,请不要使用该交易。 - Don Rolling
1
这个似乎做了你说的事情,但对我来说并没有解决问题。 - Don Rolling
你应该将Exec()调用包装在一个条件语句中:IF (@SQL IS NOT NULL) OR (LEN(@SQL) > 0)。否则,在没有连接的情况下,它将失败。 - suneg

143

虽然现在可能为时已晚,但这对未来的用户可能有用。

在删除数据库之前,您可以使用以下查询:

 use master go
 alter database [MyDatbase] set single_user with rollback immediate

 drop database [MyDatabase]

它会起作用。您也可以参考

如何在SQL脚本中指定“关闭现有连接”

我希望它能帮到你 :)


2
请勿忘记在开头添加以下内容:go如果您当前选择的是[MyDatabase]。 - Thành Chung Bùi
1
@ThànhChungBùi 您所指出的问题解决了我的问题。它应该被包含在答案中。谢谢。 - Shahryar Saljoughi

84

有人连接到数据库。尝试切换到另一个数据库,然后删除它:

尝试使用SP_WHO查看谁连接了

如果需要,使用KILL命令


27
针对 SQL Server Mgmt. Studio: 右键点击数据库:属性 -> 选项 -> 访问限制: 将其设置为“单用户”,然后执行删除操作。 - AceAlfred
invoke-sqlcmd -ServerInstance localhost 'exec sp_who' | where-object {$_.dbname -eq 'myDbName'} 没有返回任何内容。然而,它仍然报错。这似乎并没有真正起作用。 - Pxtl
1
@AceAlfred,你的方法是所有方法中最简单易懂的。本应该是答案之一。谢谢。 - Amit Ray
1
使用SP_WHO验证ID,然后使用KILL命令终止进程,例如KILL 123。 - undefined

59

对于SQL Server管理工具:

右键点击数据库:属性 -> 选项 -> 限制访问:设置为"单用户",然后执行删除操作。


1
如果您想直接从管理工具中删除数据库,这是最直观的解决方案。谢谢。 - Andre Pena
2
我执行了这个操作,然后使用了 drop database myDatabase。但是它并没有解决问题,仍然出现相同的错误(... it is currently is use)。 - Shahryar Saljoughi
@ShahryarSaljoughi 我只是按照acealfred的指示去做。也许菜单方式执行了一些简单下拉之外的其他命令。 - Michael

47

在 SQL Server Management Studio 2016 中,执行以下步骤:

  • 右键单击数据库

  • 点击删除

  • 勾选关闭现有连接

  • 执行删除操作


36
select * from sys.sysprocesses where dbid = DB_ID('Test')

(将'Test'替换为您尝试删除的数据库名称) 这将告诉您哪些进程正在使用它。

如果您仍想强制删除,最终方法是:

USE master;
GO
ALTER DATABASE Test 
SET SINGLE_USER 
WITH ROLLBACK IMMEDIATE;
GO
DROP DATABASE Test;
希望这有帮助!

10

首先将您的数据库下线,然后分离它,例如:

Use Master
GO
ALTER DATABASE dbname SET OFFLINE
GO
EXEC sp_detach_db 'dbname', 'true'

1
我认为此操作不会删除数据库。 - snp.it
2
分离数据库后,现在可以使用以下查询删除它:DROP DATABASE dbname; - Hidayat Arghandabi

8

如果你在SQL Management Studio中删除数据库时收到该消息,请记得选择Master作为所选数据库,否则你的查询也将成为连接到数据库的查询。

USE Master;
GO
DROP DATABASE AdventureWorks;
GO

在我的情况下,我有超过1个连接到数据库,我想要断开。 - AlexMelw

8

首先检查已连接的数据库

SP_WHO

其次,断开数据库连接。

DECLARE @DatabaseName nvarchar(50)
SET @DatabaseName = N'your_database_name'

DECLARE @SQL varchar(max)

SELECT @SQL = COALESCE(@SQL,'') + 'Kill ' + Convert(varchar, SPId) + ';'
FROM MASTER..SysProcesses
WHERE DBId = DB_ID(@DatabaseName) AND SPId <> @@SPId

--SELECT @SQL 
EXEC(@SQL)

终于放弃它


drop database your_database

4
  1. 首先,您应该将数据库状态更改为单用户模式
  2. 然后进入主数据库
  3. 最后删除数据库

例如:

My Data Base Name Is Test1

ALTER DATABASE Test1 SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO

USE master
GO
DROP DATABASE Test1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接