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

时间:2011-09-19 09:54:48

标签: c# asp.net sql-server

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

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

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

18 个答案:

答案 0 :(得分:93)

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

我在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 :(得分:39)

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

尝试

SP_WHO看看谁联系了

如果需要,

KILL

答案 2 :(得分:33)

对于SQL server mgmt。工作室:

右键单击数据库:属性 - &gt;选项 - &gt;限制访问:设置为“单个用户”并在之后执行删除

答案 3 :(得分:30)

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

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

 alter database [MyDatbase] set single_user with rollback immediate

 drop database [MyDatabase]

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

How do I specify "close existing connections" in sql script

我希望它会对你有所帮助:)。

答案 4 :(得分:17)

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

  • 右键单击数据库

  • 点击删除

  • 检查关闭现有连接

  • 执行删除操作

答案 5 :(得分:12)

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

(替换&#39;测试&#39;以及您要删除的数据库的名称) 这将告诉您哪些进程正在使用它。

如果你还想强行放弃,那么最终的方法是:

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

希望这有帮助!

答案 6 :(得分:4)

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

USE Master;
GO
DROP DATABASE AdventureWorks;
GO

答案 7 :(得分:3)

首先将数据库脱离,然后将其分离,例如

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

答案 8 :(得分:2)

强力解决方法可能是:

  1. 停止SQL Server服务。

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

  3. 启动SQL Server服务。

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

答案 9 :(得分: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

<强>更新 在这里使用this转换器是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);
        }
    }

答案 10 :(得分: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

答案 11 :(得分:0)

使用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

答案 12 :(得分:0)

只是重命名数据库(要删除)对我来说很有用。它取消了访问数据库的任何进程,因此我可以删除数据库。

答案 13 :(得分:0)

我想说我使用的脚本来自以下两个答案。

支持@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]]]

答案 14 :(得分:0)

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

答案 15 :(得分:0)

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

答案 16 :(得分: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

Screen

答案 17 :(得分:0)

使用这个:

/* Delete Database Backup and Restore History from MSDB System Database */
EXEC msdb.dbo.sp_delete_database_backuphistory @database_name = N'[dba]'
GO

/* Query to Get Exclusive Access of SQL Server Database before Dropping the Database  */
USE [master]
GO

ALTER DATABASE [dba]

SET SINGLE_USER
WITH

ROLLBACK IMMEDIATE
GO

/* Query to Drop Database in SQL Server  */
DROP DATABASE [dba]
GO