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

我想删除一个数据库。

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

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

249661 次浏览

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

试试看

SP_WHO看看谁接通了

以及 KILL(如果需要的话)

在删除数据库之前,首先需要删除到目标数据库的所有连接。

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

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

暴力解决方案可以是:

  1. 停止 SQLServer 服务。

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

  3. 启动 SQLServer 服务。

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

对于 SQL 服务器 mgmt.Studio:

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

只是重命名数据库(被删除)为我做了诀窍。它脱离了访问数据库的程序,所以我可以删除数据库。

虽然为时已晚,但它对未来的用户可能是有用的。

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

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


drop database [MyDatabase]

会有用的,你也可以参考

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

我希望它能帮助你:)

使用 MSSQLServer2008,在 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

只是想给一个 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

希望这能帮到你们 鸡肉

更新 这里使用的是 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);
}
}

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

USE Master;
GO
DROP DATABASE AdventureWorks;
GO
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;

希望这个能帮上忙!

我想说的是,我使用的脚本是从下面的两个答案派生出来的。

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

转到可用数据库部分,选择 master。然后尝试 DROP DATABASE the _ DB _ name。

在 SQLServerManagementStudio2016中,执行下列操作:

  • 右键单击数据库

  • 点击删除

  • 检查关闭现有连接

  • 执行删除操作

首先让你的数据库脱机后,分离它例如。

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

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

@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

首先检查连接的数据库

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

用这个:

/* 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