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


89

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

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);
    }
}

我收到错误消息,因为不能删除数据库,因为它正在使用中。请帮我解决上述问题。

Answers:


55

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

尝试

SP_WHO 看看谁连接了

并且KILL如果需要的话


14
对于SQL Server mgmt。studio:右键单击数据库:Properties-> Options-> Restrict Access:设置为“ Single User”,然后执行删除操作。
AceAlfred

invoke-sqlcmd -ServerInstance本地主机'exec sp_who'| where-object {$ _。dbname -eq'myDbName'}不返回任何内容。然而直到抱怨。这似乎实际上不起作用。
Pxtl

112

在删除数据库之前,请先删除与该数据库的连接。

我在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)

1
+1我想知道为什么您没有早点得到这个,这是一个非常方便的答案。谢谢
Mehdi LAMRANI 2012年

那也不会引入非用户进程吗?
13年

对我来说,我收到错误消息“无法在用户事务内部使用KILL命令”。
Ally 2014年

如果交易引起问题,请不要使用该交易。
唐·罗兰

仅供参考,这似乎可以按照您所说的去做,但并不能为我解决问题。
Don Rolling

42

对于SQL Server mgmt。工作室:

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


如果您想直接从Management Studio删除数据库,这是最直观的解决方案。谢谢。
安德烈·佩纳

我做到了,然后使用了drop database myDatabase。它没有解决问题。发生相同的错误(... it is currently is use)。
Shahryar Saljoughi

40

为时已晚,但对将来的用户可能有用。

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

 alter database [MyDatbase] set single_user with rollback immediate

 drop database [MyDatabase]

会的。您也可以参考

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

希望对您有所帮助:)


1
不要忘了,在开始时添加这个use master go ,以及如果你目前选择[MyDatabase的]
清涌裴

1
@ThànhChungBùi您所说的解决了我的问题。它应该包括在答案中。谢谢。
Shahryar Saljoughi

29

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

  • 右键单击数据库

  • 点击删除

  • 检查关闭现有连接

  • 执行删除操作


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

(将“测试”替换为您要删除的数据库的名称),这将告诉您哪些进程正在使用它。

如果仍然要强制下降,那么最终方法是:

USE master;
GO
ALTER DATABASE Test 
SET SINGLE_USER 
WITH ROLLBACK IMMEDIATE;
GO
DROP DATABASE Test;

希望这可以帮助 !


先生,您救了我的命;)在我的情况下,以上都不起作用,您的建议如前所述!
Dimitri '18


6

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

USE Master;
GO
DROP DATABASE AdventureWorks;
GO

在我的情况下,我与DB II的连接超过了1个,希望断开连接。
AlexMelw

3

蛮力解决方法可能是:

  1. 停止SQL Server服务。

  2. 删除相应的.mdf和.ldf文件。

  3. 启动SQL Server服务。

  4. 与SSMS连接并删除数据库。


这个对我有用。谢谢。我认为问题是外部硬盘驱动器。我将文件切换到本地磁盘。感谢您的解决方案。
InfZero 2014年

2

我想指出的是,我使用了一个脚本,该脚本源自以下两个答案。

@Hitesh Mistry和@unruledboy的道具

DECLARE @DatabaseName nvarchar(50)
SET @DatabaseName = N'[[[DatabaseName]]]'

DECLARE @SQL varchar(max)

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

EXEC(@SQL)

alter database [[[DatabaseName]]] set single_user with rollback immediate

DROP DATABASE [[[DatabaseName]]]

1

使用MS SQL Server 2008,在带有关闭连接选项的DELETE对话框中,这是生成的脚本,我猜这是最好的:

EXEC msdb.dbo.sp_delete_database_backuphistory @database_name = N'YOUR_DATABASE_NAME'
GO
USE [master]
GO
ALTER DATABASE [YOUR_DATABASE_NAME] SET  SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
USE [master]
GO
/****** Object:  Database [YOUR_DATABASE_NAME]    Script Date: 01/08/2014 21:36:29 ******/
DROP DATABASE [YOUR_DATABASE_NAME]
GO

这就是SQL Server Management Studio脚本编写出来的内容,并且对我有用。我唯一不同的方式是将所有内容包装在USE [master] IF EXISTS(SELECT * FROM sys.databases WHERE name = 'Database_Name') BEGIN -- your script here END
Smitty-Werben-Jager-Manjenson

1

我只想提供一个vb.net(如果要转换,则使用C语言。)我在安装我的一个程序时遇到了类似的问题,删除数据库有点棘手,是的,可能会使用户进入服务器将其删除使用Express,但多数民众赞成在清理后,经过几次环顾后得到了一点点完美的代码...

    Sub DropMyDatabase()
    Dim Your_DB_To_Drop_Name As String = "YourDB"
    Dim Your_Connection_String_Here As String = "SERVER=MyServer;Integrated Security=True"
    Dim Conn As SqlConnection = New SqlConnection(Your_Connection_String_Here)

    Dim AlterStr As String = "ALTER DATABASE " & Your_DB_To_Drop_Name & " SET OFFLINE WITH ROLLBACK IMMEDIATE"
    Dim AlterCmd = New SqlCommand(AlterStr, Conn)

    Dim DropStr As String = "DROP DATABASE " & Your_DB_To_Drop_Name
    Dim DropCmd = New SqlCommand(DropStr, Conn)

    Try
        Conn.Open()
        AlterCmd.ExecuteNonQuery()
        DropCmd.ExecuteNonQuery()
        Conn.Close()

    Catch ex As Exception
        If (Conn.State = ConnectionState.Open) Then
            Conn.Close()
        End If
        MsgBox("Failed... Sorry!" & vbCrLf & vbCrLf & ex.Message)
    End Try
End Sub

希望这对寻找xChickenx的人有所帮助

更新这里 使用转换器是C#版本:

public void DropMyDatabase()
    {
        var Your_DB_To_Drop_Name = "YourDB";
        var Your_Connection_String_Here = "SERVER=MyServer;Integrated Security=True";
        var Conn = new SqlConnection(Your_Connection_String_Here);

        var AlterStr = "ALTER DATABASE " + Your_DB_To_Drop_Name + " SET OFFLINE WITH ROLLBACK IMMEDIATE";
        var AlterCmd = new SqlCommand(AlterStr, Conn);

        var DropStr = "DROP DATABASE " + Your_DB_To_Drop_Name;
        var DropCmd = new SqlCommand(DropStr, Conn);

        try
        {
            Conn.Open();
            AlterCmd.ExecuteNonQuery();
            DropCmd.ExecuteNonQuery();
            Conn.Close();

        }
        catch(Exception ex)
        {
            if((Conn.State == ConnectionState.Open))
            {
                Conn.Close();
            }
            Trace.WriteLine("Failed... Sorry!" + Environment.NewLine + ex.Message);
        }
    }

该问题需要C#响应,因为它是用这种方式标记的。
Mathias Lykkegaard Lorenzen 2014年

@MathiasLykkegaardLorenzen有几个免费的应用程序可以转换所有语言的.NET代码。甚至还有在线应用程序。
Ognyan Dimitrov 2015年

1
点了。我会更改我的投票,但我不能更改,因为它已被锁定。
Mathias Lykkegaard Lorenzen 2015年

馊主意!在正常情况下删除数据库不会删除数据库文件!即使在某些特殊情况下方便使用,也不是您应该盲目遵循的模式。问题:a)磁盘已满,b)尝试使用相同的物理文件重新创建数据库时,您可能会遇到问题。
Stefan Steinegger

1

首先检查连接的数据库

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

0

您不能删除当前正在使用的数据库,但是sp_detach_db如果要从服务器删除数据库而不删除数据库文件,则可以使用存储过程。


0

只是重命名数据库(将要删除)对我来说就成功了。它摆脱了访问数据库的任何进程的束缚,因此我能够删除数据库。


0

转到可用数据库部分,然后选择主数据库。然后尝试DROP DATABASE the_DB_name。


0

要删除数据库,即使它正在运行,也可以使用此批处理文件

@echo off

set /p dbName= "Enter your database name to drop: " 

echo Setting to single-user mode
sqlcmd -Q "ALTER DATABASE [%dbName%] SET  SINGLE_USER WITH ROLLBACK IMMEDIATE"

echo Dropping...
sqlcmd -Q "drop database %dbName%"

echo Completed.

pause

屏幕

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.