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

sac*_*rni 74 c# sql-server asp.net

我想删除一个数据库.我使用了以下代码,但无济于事.

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到错误,因为它无法删除数据库,因为它当前正在使用中.请帮助我解决上述问题.

unr*_*boy 94

在删除数据库之前,首先删除与该数据库的连接.

我在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)
Run Code Online (Sandbox Code Playgroud)

  • +1 我想知道你为什么没有早点得到这个,这是一个非常方便的答案。谢谢 (2认同)

Gre*_*zik 44

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

尝试

SP_WHO 看谁有联系

并且KILL如果需要的话

  • 对于SQL server mgmt.studio:右键单击数据库:属性 - >选项 - >限制访问:设置为"单个用户"并在之后执行删除. (11认同)

Ace*_*red 35

对于SQL server mgmt.工作室:

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

  • 我做到了,然后使用“drop database myDatabase”。它没有解决问题。发生了同样的错误(“...目前正在使用”)。 (2认同)

小智 31

现在为时已晚,但对未来的用户可能会有所帮助.

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

 alter database [MyDatbase] set single_user with rollback immediate

 drop database [MyDatabase]
Run Code Online (Sandbox Code Playgroud)

它会工作.你也可以参考

如何在sql脚本中指定"关闭现有连接"

我希望它能帮到你:)

  • 如果您当前选择 [MyDatabase],也不要忘记在开头添加此内容 ```use master go ``` (2认同)

小智 22

在SQL Server Management Studio 2016中,执行以下操作:

  • 右键单击数据库

  • 点击删除

  • 检查关闭现有连接

  • 执行删除操作


Raz*_*aza 13

select * from sys.sysprocesses where dbid = DB_ID('Test')
Run Code Online (Sandbox Code Playgroud)

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

如果你还想强制下降那么,最终的方法是:

USE master;
GO
ALTER DATABASE Test 
SET SINGLE_USER 
WITH ROLLBACK IMMEDIATE;
GO
DROP DATABASE Test;
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助 !


Ral*_*sen 8

如果您在 SQL Management Studio 中删除数据库并收到消息,请不要忘记您使用 Master 作为选定的数据库,否则您的查询也是到数据库的连接。

USE Master;
GO
DROP DATABASE AdventureWorks;
GO
Run Code Online (Sandbox Code Playgroud)


小智 8

首先使您的数据库脱机,然后将其分离,例如

Use Master
GO
ALTER DATABASE dbname SET OFFLINE
GO
EXEC sp_detach_db 'dbname', 'true'
Run Code Online (Sandbox Code Playgroud)

  • 分离数据库后,现在可以使用此查询将其删除。`删除数据库 dbname; ` (2认同)

小智 5

首先检查连接的数据库

SP_WHO
Run Code Online (Sandbox Code Playgroud)

第二次断开您的数据库

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)
Run Code Online (Sandbox Code Playgroud)

最后放下它

drop database your_database
Run Code Online (Sandbox Code Playgroud)


小智 5

  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
Run Code Online (Sandbox Code Playgroud)