Не удается удалить базу данных, так как она используется в настоящее время
Я хочу удалить базу данных. Я использовал следующий код, но безрезультатно.
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);
}
}
Я получаю ошибку как не удается удалить базу данных, потому что она в настоящее время используется. Пожалуйста, помогите мне в вышеупомянутом вопросе.
15 ответов:
кто-то подключился к базе данных. Попробуйте переключиться на другую базу данных, а затем, чтобы удалить его:
попробовать
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)
для SQL server mgmt. студия:
щелкните правой кнопкой мыши базу данных: свойства - > параметры - > ограничить доступ : установите значение "один пользователь" и выполните падение впоследствии
Это слишком поздно, но это может быть полезно для будущих пользователей.
вы можете использовать следующий запрос перед удалением запроса базы данных:
alter database [MyDatbase] set single_user with rollback immediate drop database [MyDatabase]
Он будет работать. Вы также можете обратиться к
Как указать "закрыть существующие соединения" в SQL script
Я надеюсь, что это поможет вам :)
в среде SQL Server Management Studio 2016 выполните следующие действия:
Правой Кнопкой Мыши на базе данных
Нажмите кнопку Удалить
Регистрация закрыть существующие соединения
выполнить операцию удаления
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;
надеюсь, что это помогает !
Если вы отбрасываете базу данных в SQL Management Studio и получаете сообщение, не забывайте, что вы используете Master в качестве выбранной базы данных, иначе ваш запрос также является подключением к базе данных.
USE Master; GO DROP DATABASE AdventureWorks; GO
сначала сделайте свою базу данных автономной после этого отсоедините ее, например
Use Master GO ALTER DATABASE dbname SET OFFLINE GO EXEC sp_detach_db 'dbname', 'true'
обходной путь грубой силы может быть:
остановите службу SQL Server.
удалить соответствующую .MDF и. файлы ldf.
запустите службу SQL Server.
подключитесь к SSMS и удалите базу данных.
просто хотел дать 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); } }
вы не можете удалить базу данных в настоящее время используется однако, вы можете использовать
sp_detach_db
хранимая процедура, если вы хотите удалить базу данных с сервера без удаления файлов базы данных.
просто переименование БД (для удаления) сделало трюк для меня. он вышел из-под контроля любого процесса доступа к базе данных, и поэтому я смог отбросить базу данных.
используя MS SQL Server 2008, в диалоговом окне удаления с закрытыми параметрами подключения, это сгенерированный скрипт, я думаю, что это лучший:
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]]]