Невозможно удалить базу данных, потому что она в настоящее время используется


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

Я получаю сообщение об ошибке, так как не могу удалить базу данных, поскольку она в настоящее время используется . Пожалуйста, помогите мне в вышеупомянутой проблеме.

Ответы:


55

Кто-то подключился к базе данных. Попробуйте переключиться на другую базу данных, а затем отбросить ее:

Пытаться

SP_WHO чтобы увидеть, кто подключился

и KILLесли нужно


14
Для управления SQL-сервером. studio: щелкните правой кнопкой мыши базу данных: Свойства -> Параметры -> Ограничить доступ: установите значение «Один пользователь» и затем выполните удаление.
AceAlfred

invoke-sqlcmd -ServerInstance localhost '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 08

Разве это не приведет к появлению непользовательских процессов?
monksy 08

У меня появляется ошибка «Команда KILL не может использоваться внутри пользовательских транзакций».
Элли

Если транзакция вызывает проблему, не используйте транзакцию.
Дон Роллинг

К вашему сведению, это похоже на то, что вы сказали, но не решает проблему для меня.
Дон Роллинг

43

Для управления SQL-сервером. студия:

Щелкните правой кнопкой мыши базу данных: «Свойства» -> «Параметры» -> «Ограничить доступ»: установите значение «Один пользователь» и затем выполните удаление.


Если вы хотите удалить базу данных прямо из Management Studio, это наиболее интуитивно понятное решение. Спасибо.
Андре Пена

Сделал, а потом использовал drop database myDatabase. Это не решило проблему. та же ошибка ( ... it is currently is use) произошла.
Шахрияр Салджуги,

40

Слишком поздно, но может пригодиться будущим пользователям.

Вы можете использовать следующий запрос, прежде чем отбрасывать запрос к базе данных:

 alter database [MyDatbase] set single_user with rollback immediate

 drop database [MyDatabase]

Это будет работать. Вы также можете обратиться к

Как указать «закрыть существующие подключения» в sql-скрипте

Надеюсь, это вам поможет :)


1
не забудьте добавить это в начале, use master go если вы сейчас выбираете [MyDatabase]
Thành Chung

1
@ ThànhChungBùi то, на что вы указали, решило мою проблему. Это должно быть включено в ответы. Спасибо.
Шахрияр Салджуги,

29

В SQL Server Management Studio 2016 выполните следующие действия:

  • Щелкните правой кнопкой мыши базу данных

  • Нажмите удалить

  • Проверить, закрыть существующие подключения

  • Выполнить операцию удаления


20
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;

Надеюсь это поможет !


Вы, сэр, спасли мне день;) В моем случае ничего из вышеперечисленного не сработало, ваши предложения сработали, как описано!
Димитрий

8

Сначала отключите вашу базу данных, после этого отключите ее, например

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

Я не думаю, что действие удаляет базу данных.
snp.it

1
после отсоединения базы данных теперь она готова к удалению с помощью этого запроса. DROP DATABASE dbname;
Хидаят Аргандаби

6

Если вы удаляете базу данных в SQL Management Studio и получаете сообщение, не забывайте, что вы используете Master в качестве выбранной базы данных, иначе ваш запрос также является подключением к базе данных.

USE Master;
GO
DROP DATABASE AdventureWorks;
GO

В моем случае у меня было более одного подключения к БД, я хотел сбросить.
AlexMelw

3

Возможный обходной путь с использованием грубой силы:

  1. Остановите службу SQL Server.

  2. Удалите соответствующие файлы .mdf и .ldf.

  3. Запустите службу SQL Server.

  4. Подключитесь к SSMS и удалите базу данных.


Меня устраивает. Спасибо. Думаю, проблема во внешнем жестком диске. Я переключил файл на локальный диск. Спасибо за ваше решение.
InfZero

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
Смитти-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 #, так как он помечен таким образом.
Матиас Ликкегаард Лоренцен,

@MathiasLykkegaardLorenzen есть несколько бесплатных приложений, которые могут переводить код .NET на все языки. Есть даже онлайн-приложения.
Огнян Димитров

1
Дело принято. Я бы изменил свой голос, но не могу, так как он заблокирован.
Матиас Ликкегор Лоренцен,

ПЛОХАЯ ИДЕЯ! Удаление базы данных, когда она отключена, не приведет к удалению файлов базы данных! Даже если это может быть удобно в каком-то особом случае, вы не должны слепо следовать этому шаблону. Проблемы: а) ваш диск заполняется и б) вы можете столкнуться с проблемами при попытке воссоздать базу данных с использованием тех же физических файлов.
Стефан

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

Экран

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.