Nie można usunąć bazy danych, ponieważ jest ona obecnie używana


89

Chcę usunąć bazę danych. Użyłem następującego kodu, ale bezskutecznie.

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

Otrzymuję błąd, ponieważ nie można usunąć bazy danych, ponieważ jest ona obecnie używana . Proszę o pomoc w powyższej kwestii.

Odpowiedzi:


55

Ktoś połączony z bazą danych. Spróbuj przełączyć się do innej bazy danych, a następnie ją porzucić:

Próbować

SP_WHO aby zobaczyć, kto się połączył

iw KILLrazie potrzeby


14
W przypadku zarządzania serwerem SQL. studio: Baza danych kliknij prawym przyciskiem: Właściwości -> Opcje -> Ogranicz dostęp: Ustaw na „Pojedynczy użytkownik”, a następnie przeprowadź upuszczanie.
AceAlfred

invoke-sqlcmd -ServerInstance localhost 'exec sp_who' | gdzie-obiekt {$ _. dbname -eq 'myDbName'} nic nie zwraca. A jednak aż narzeka. To chyba nie działa.
Pxtl

112

przed upuszczeniem bazy danych należy najpierw zakończyć połączenie z tą bazą danych.

Znalazłem rozwiązanie pod adresem 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 Zastanawiam się, dlaczego nie dostałeś tego wcześniej, to bardzo przydatna odpowiedź. Dzięki
Mehdi LAMRANI

Czy nie spowoduje to również wprowadzenia procesów innych niż użytkownicy?
mnichów

U mnie pojawia się komunikat o błędzie „Polecenie KILL nie może być używane w transakcjach użytkownika”.
Sprzymierzeniec

Jeśli transakcja powoduje problem, nie używaj jej.
Don Rolling

FYI, wydaje się, że robi to, co powiedziałeś, ale nie rozwiązuje problemu.
Don Rolling

42

W przypadku zarządzania serwerem SQL. studio:

Baza danych kliknij prawym przyciskiem myszy: Właściwości -> Opcje -> Ogranicz dostęp: Ustaw na „Pojedynczy użytkownik”, a następnie wykonaj upuszczanie


Jeśli chcesz usunąć bazę danych bezpośrednio z Management Studio, jest to najbardziej intuicyjne rozwiązanie. Dziękuję Ci.
André Pena

Zrobiłem to, a potem użyłem drop database myDatabase. To nie rozwiązało problemu. wystąpił ten sam błąd ( ... it is currently is use).
Shahryar Saljoughi

40

Jest już za późno, ale może się przydać przyszłym użytkownikom.

Możesz użyć poniższego zapytania przed porzuceniem zapytania do bazy danych:

 alter database [MyDatbase] set single_user with rollback immediate

 drop database [MyDatabase]

To będzie działać. Możesz również odnieść się do

Jak określić „zamknij istniejące połączenia” w skrypcie sql

Mam nadzieję, że ci to pomoże :)


1
nie zapomnij dodać tego również na początku, use master go jeśli obecnie wybierzesz [MyDatabase]
Thành Chung Bùi

1
@ ThànhChungBùi to, na co wskazałeś, rozwiązało mój problem. Powinien być zawarty w odpowiedziach. Dziękuję Ci.
Shahryar Saljoughi

29

W programie SQL Server Management Studio 2016 wykonaj następujące czynności:

  • Kliknij prawym przyciskiem myszy bazę danych

  • Kliknij usuń

  • Sprawdź zamknij istniejące połączenia

  • Wykonaj operację usuwania


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

(Zastąp „Test” nazwą bazy danych, którą próbujesz usunąć). Dzięki temu dowiesz się, które procesy jej używają.

Jeśli nadal chcesz wymusić spadek, ostatecznym podejściem jest:

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

Mam nadzieję że to pomoże !


Pan uratował mi dzień;) Nic z powyższego nie zadziałało w moim przypadku, Wasze sugestie zadziałały zgodnie z opisem!
Dimitri

8

Najpierw wyłącz bazę danych, a następnie odłącz ją np

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

Nie sądzę, żeby akcja usuwała bazę danych.
snp.it

1
po odłączeniu bazy danych jest teraz gotowa do usunięcia za pomocą tego zapytania. DROP DATABASE dbname;
Hidayat Arghandabi

6

Jeśli upuszczasz bazę danych w SQL Management Studio i otrzymujesz komunikat, nie zapomnij, że używasz bazy danych Master jako wybranej bazy danych, w przeciwnym razie twoje zapytanie jest również połączeniem z bazą danych.

USE Master;
GO
DROP DATABASE AdventureWorks;
GO

W moim przypadku miałem więcej niż 1 połączenie z DB II, które chciałem zrzucić.
AlexMelw

3

Obejściem brutalnej siły może być:

  1. Zatrzymaj usługę SQL Server.

  2. Usuń odpowiednie pliki .mdf i .ldf.

  3. Uruchom usługę SQL Server.

  4. Połącz się z SSMS i usuń bazę danych.


Mi to pasuje. Dzięki. Myślę, że problem dotyczy zewnętrznego dysku twardego. Przełączyłem plik na dysk lokalny. Dzięki za rozwiązanie.
InfZero

2

Chciałem zaznaczyć, że użyłem skryptu wywodzącego się z dwóch poniższych odpowiedzi.

Podziękowania dla @Hitesh Mistry i @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

Używając MS SQL Server 2008, w oknie dialogowym USUŃ z opcjami Zamknij połączenie, jest to wygenerowany skrypt, myślę, że jest najlepszy:

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

To właśnie wykrywa skrypty SQL Server Management Studio i co mi się przydarza. Jedyną rzeczą, którą zrobiłem inaczej, było zawinięcie tego wszystkiego wUSE [master] IF EXISTS(SELECT * FROM sys.databases WHERE name = 'Database_Name') BEGIN -- your script here END
Smitty-Werben-Jager-Manjenson

1

Chciałem tylko dać vb.net (tak jak w przypadku języka c, jeśli chcesz przekonwertować ...) Miałem podobny problem z odinstalowaniem jednego z moich programów, upuszczenie bazy danych było trochę trudne, tak, może skłonić użytkowników do przejścia na serwer, porzuć go używając Express, ale to nie jest czyste, po kilku rozglądaniu się zebrałem razem doskonały kawałek kodu ...

    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

Mam nadzieję, że pomoże to każdemu, kto szuka xChickenx

AKTUALIZACJA Przy użyciu tego konwertera jest tutaj wersja 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);
        }
    }

Pytanie wymaga odpowiedzi w języku C #, ponieważ jest oznaczone w ten sposób.
Mathias Lykkegaard Lorenzen

@MathiasLykkegaardLorenzen jest kilka darmowych aplikacji, które mogą tłumaczyć kod .NET na wszystkie języki. Są nawet aplikacje online.
Ognyan Dimitrov

1
Punkt zajęty. Zmieniłbym swój głos, ale nie mogę, ponieważ jest zablokowany.
Mathias Lykkegaard Lorenzen

KIEPSKI POMYSŁ! Upuszczenie bazy danych, gdy jest poza siecią, nie spowoduje usunięcia plików bazy danych! Nawet jeśli może to być przydatne w jakimś szczególnym przypadku, nie jest to wzór, za którym powinieneś na ślepo podążać. Problemy: a) dysk się zapełni, b) możesz napotkać problemy podczas próby odtworzenia bazy danych przy użyciu tych samych plików fizycznych.
Stefan Steinegger,

1

Najpierw sprawdź podłączone bazy danych

SP_WHO

Po drugie Odłącz bazę danych

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)

WRESZCIE UPUŚĆ

drop database your_database

0

Nie możesz usunąć aktualnie używanej bazy danych, ale możesz użyć sp_detach_dbprocedury składowanej, jeśli chcesz usunąć bazę danych z serwera bez usuwania plików bazy danych.


0

sama zmiana nazwy DB (do usunięcia) załatwiła mi sprawę. uwolnił się od jakiegokolwiek procesu, który uzyskiwał dostęp do bazy danych, więc mogłem ją porzucić.


0

Przejdź do sekcji dostępnych baz danych i wybierz wzorzec. Następnie spróbuj DROP DATABASE the_DB_name.


0

Aby usunąć bazę danych, nawet jeśli jest uruchomiona, możesz użyć tego pliku wsadowego

@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

Ekran

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.