由于当前正在使用,无法删除数据库
我想删除一个数据库。 我已经使用了下面的代码,但无济于事。
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); } }
我越来越错误, 因为它目前正在使用不能删除数据库 。 请帮我解决上述问题。
有人连接到数据库。 尝试切换到另一个数据库,然后放下它:
尝试
SP_WHO
看谁连接
并KILL
如果需要的话
在删除数据库之前,首先删除与该数据库的连接。
我在http://www.kodyaz.com/articles/kill-all-processes-of-a-database.aspxfind了解决scheme
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)
对于SQL服务器pipe理。 工作室:
右键单击数据库:属性 – >选项 – >限制访问:设置为“单用户”,然后执行删除操作
这为时已晚,但对未来的用户可能有用。
在删除数据库查询之前,您可以使用下面的查询:
alter database [MyDatbase] set single_user with rollback immediate drop database [MyDatabase]
它会工作。 你也可以参考
如何在sql脚本中指定“closures现有连接”
我希望它会帮助你:)
select * from sys.sysprocesses where dbid = DB_ID('Test')
(用你试图删除的数据库的名字replace'Test')这将告诉你哪些进程正在使用它。
如果你还想强迫下降,最终的办法是:
USE master; GO ALTER DATABASE Test SET SINGLE_USER WITH ROLLBACK IMMEDIATE; GO DROP DATABASE Test;
希望这可以帮助 !
在SQL Server Management Studio 2016中,执行以下操作:
-
右键点击数据库
-
点击删除
-
检查closures现有的连接
-
执行删除操作
如果您在SQL Management Studio中删除数据库并收到消息,请不要忘记将Master用作所选数据库,否则您的查询也是与数据库的连接。
USE Master; GO DROP DATABASE AdventureWorks; GO
蛮力的解决方法可能是:
-
停止SQL Server服务。
-
删除相应的.mdf和.ldf文件。
-
启动SQL Server服务。
-
连接SSMS并删除数据库。
只是想给一个VB.NET(如果想与C语言转换..)我有一个类似的问题,我的程序卸载,删除数据库有点棘手,是的可以让用户进入服务器放下它使用快递,但多数民众赞成在不干净,几个周围后,得到了一个完美的一点点的代码…
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); } }
您不能删除当前正在使用的数据库,但是如果要从服务器删除数据库而不删除数据库文件,则可以使用sp_detach_db
存储过程。
只是重命名数据库(待删除)为我做了诡计。 它不pipe进入数据库的过程如何,所以我可以删除数据库。
使用MS SQL Server 2008,在closures连接选项的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
我想大声说出我使用了一个来自下面两个答案的脚本。
道具@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]]]
转到可用的数据库部分,并select主。 然后尝试DROP DATABASE the_DB_name。
首先让你的数据库脱机后脱离它,例如
Use Master GO ALTER DATABASE dbname SET OFFLINE GO EXEC sp_detach_db 'dbname', 'true'