Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

Попробуйте

SP_WHO, чтобы узнать, кто подключен

и KILL при необходимости

Ответ 2

перед удалением базы данных сначала вы удаляете соединение с этой базой.

Я нашел решение на 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)

Ответ 3

Для сервера SQL mgmt. студия:

Щелкните правой кнопкой мыши по базе данных: Свойства → Параметры → Ограничить доступ: установите значение "Одиночный пользователь" и выполните следующее:

Ответ 4

Это слишком поздно, но может быть полезно для будущих пользователей.

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

 alter database [MyDatbase] set single_user with rollback immediate

 drop database [MyDatabase]

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

Как указать и закрыть существующие соединения? в sql script

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

Ответ 5

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

(Замените "Тест" на имя базы данных, которую вы пытаетесь удалить) Это скажет вам, какие процессы используют его.

Если вы все еще хотите принудительно отбросить, то конечный подход:

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

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

Ответ 6

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

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

  • Нажмите "Удалить"

  • Проверить закрытие существующих соединений

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

Ответ 7

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

USE Master;
GO
DROP DATABASE AdventureWorks;
GO

Ответ 8

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

  • Остановить службу SQL Server.

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

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

  • Подключение к SSMS и удаление базы данных.

Ответ 9

Просто хотел дать vb.net(как с языком c, если вы хотите конвертировать..) У меня была аналогичная проблема для uninstal одной из моих программ, сброс БД был немного сложным, да, можно заставить пользователей войти в сервер отбрасывает его с помощью 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

UPDATE Используя этот конвертер, это версия С#:

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

Вы не можете удалить базу данных, которая в настоящее время используется, но вы можете использовать хранимую процедуру sp_detach_db, если вы хотите удалить базу данных с сервера, не удаляя файлы базы данных.

Ответ 11

просто переименование БД (чтобы удалить) помогло. он потерял контроль над тем, что процесс доступа к базе данных, и поэтому я смог удалить базу данных.

Ответ 12

Используя MS SQL Server 2008, в диалоговом окне DELETE с параметрами Close connection это сгенерированный script, я думаю, это лучший результат:

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

Ответ 13

Я хотел сказать, что я использовал script, который был получен из двух нижеприведенных ответов.

Реквизит для @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

Перейдите в раздел доступных баз данных и выберите мастер. Затем попробуйте DROP DATABASE the_DB_name.

Ответ 15

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

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