Die Datenbank kann nicht gelöscht werden, da sie derzeit verwendet wird


86

Ich möchte eine Datenbank löschen. Ich habe den folgenden Code verwendet, aber ohne Erfolg.

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

Ich erhalte den Fehler, dass die Datenbank nicht gelöscht werden kann, da sie derzeit verwendet wird . Bitte helfen Sie mir in der oben genannten Ausgabe.

Antworten:


52

Jemand, der mit der Datenbank verbunden ist. Versuchen Sie, zu einer anderen Datenbank zu wechseln und diese dann zu löschen:

Versuchen

SP_WHO um zu sehen, wer verbunden ist

und KILLwenn nötig


13
Für SQL Server mgmt. Studio: Klicken Sie mit der rechten Maustaste auf Datenbank: Eigenschaften -> Optionen -> Zugriff einschränken: Stellen Sie "Einzelbenutzer" ein und führen Sie das Löschen anschließend durch.
AceAlfred

invoke-sqlcmd -ServerInstance localhost 'exec sp_who' | where-object {$ _. dbname -eq 'myDbName'} gibt nichts zurück. Doch es bis sich beschwert. Dies scheint nicht wirklich zu funktionieren.
Pxtl

108

Bevor Sie eine Datenbank löschen, trennen Sie zuerst die Verbindung zu dieser Datenbank.

Ich habe eine Lösung unter http://www.kodyaz.com/articles/kill-all-processes-of-a-database.aspx gefunden

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 Ich frage mich, warum Sie das nicht früher bekommen haben, das ist eine sehr praktische Antwort. Danke
Mehdi LAMRANI

Bringt das nicht auch Nicht-Benutzer-Prozesse mit sich?
Mönch

Ich erhalte die Fehlermeldung "Der Befehl KILL kann nicht in Benutzertransaktionen verwendet werden."
Verbündeter

Wenn die Transaktion ein Problem verursacht, verwenden Sie die Transaktion nicht.
Don Rolling

Zu Ihrer Information, dies scheint das zu tun, was Sie versprochen haben, löst das Problem jedoch nicht für mich.
Don Rolling

40

Für SQL Server mgmt. Studio:

Klicken Sie mit der rechten Maustaste auf Datenbank: Eigenschaften -> Optionen -> Zugriff einschränken: Stellen Sie "Einzelbenutzer" ein und führen Sie das Löschen anschließend durch


Wenn Sie eine Datenbank direkt aus dem Management Studio löschen möchten, ist dies die intuitivste Lösung. Danke dir.
André Pena

Ich habe es getan und dann benutzt drop database myDatabase. Es hat das Problem nicht gelöst. der gleiche Fehler ( ... it is currently is use) ist passiert.
Shahryar Saljoughi

39

Es ist zu spät, aber es kann für zukünftige Benutzer nützlich sein.

Sie können die folgende Abfrage verwenden, bevor Sie die Datenbankabfrage löschen:

 alter database [MyDatbase] set single_user with rollback immediate

 drop database [MyDatabase]

Es wird klappen. Sie können auch auf verweisen

Wie gebe ich im SQL-Skript "Vorhandene Verbindungen schließen" an?

Ich hoffe es hilft dir :)


1
Vergessen Sie nicht, dies auch am use master go Anfang hinzuzufügen, wenn Sie derzeit [MyDatabase]
Thành Chung Bùi

@ ThànhChungBùi was du gezeigt hast hat mein Problem gelöst. Es sollte in den Antworten enthalten sein. Danke dir.
Shahryar Saljoughi

26

Führen Sie in SQL Server Management Studio 2016 Folgendes aus:

  • Klicken Sie mit der rechten Maustaste auf die Datenbank

  • Klicken Sie auf Löschen

  • Überprüfen Sie, ob vorhandene Verbindungen geschlossen sind

  • Löschvorgang ausführen


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

(Ersetzen Sie 'Test' durch den Namen der Datenbank, die Sie löschen möchten.) Hier erfahren Sie, welche Prozesse sie verwenden.

Wenn Sie dennoch einen Drop erzwingen möchten, lautet der ultimative Ansatz:

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

Hoffe das hilft !


Sie, mein Herr, haben mir den Tag gerettet;) In meinem Fall hat nichts davon funktioniert, Ihre Vorschläge haben wie beschrieben funktioniert!
Dimitri

8

Schalten Sie Ihre Datenbank zuerst offline, nachdem Sie sie entfernt haben, z

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

Ich glaube nicht, dass Aktion die Datenbank löscht.
snp.it

1
Nach dem Trennen der Datenbank kann diese nun mit dieser Abfrage gelöscht werden. DROP DATABASE dbname;
Hidayat Arghandabi

5

Wenn Sie die Datenbank in SQL Management Studio löschen und die Nachricht erhalten, vergessen Sie nicht, dass Sie Master als ausgewählte Datenbank verwenden, da Ihre Abfrage sonst auch eine Verbindung zur Datenbank darstellt.

USE Master;
GO
DROP DATABASE AdventureWorks;
GO

In meinem Fall wollte ich mehr als 1 Verbindung zum DB II trennen.
AlexMelw

2

Eine Brute-Force-Problemumgehung könnte sein:

  1. Beenden Sie den SQL Server-Dienst.

  2. Löschen Sie die entsprechenden .mdf- und .ldf-Dateien.

  3. Starten Sie den SQL Server-Dienst.

  4. Stellen Sie eine Verbindung mit SSMS her und löschen Sie die Datenbank.


Für mich geht das. Vielen Dank. Ich denke, das Problem ist eine externe Festplatte. Ich habe die Datei auf eine lokale Festplatte umgestellt. Vielen Dank für Ihre Lösung.
InfZero

2

Ich wollte darauf hinweisen, dass ich ein Skript verwendet habe, das aus zwei der folgenden Antworten abgeleitet ist.

Requisiten an @Hitesh Mistry und @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

Unter Verwendung von MS SQL Server 2008 ist dies im Dialogfeld LÖSCHEN mit Verbindungsoptionen schließen das generierte Skript. Ich denke, es ist das Beste:

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

Dies ist, was SQL Server Management Studio auszeichnet und was für mich funktioniert. Das einzige, was ich anders gemacht habe, war, all das in einenUSE [master] IF EXISTS(SELECT * FROM sys.databases WHERE name = 'Database_Name') BEGIN -- your script here END
Smitty-Werben-Jager-Manjenson

1

Ich wollte nur ein vb.net geben (wie bei der Sprache c, wenn ich konvertieren möchte ..). Ich hatte ein ähnliches Problem bei der Deinstallation eines meiner Programme. Das Löschen der Datenbank war etwas schwierig. Ja, Benutzer konnten dazu gebracht werden, auf den Server zu gehen mit Express, aber das ist nicht sauber, nachdem sich ein paar Mal umgesehen haben, ist ein perfektes Stück Code zusammengekommen ...

    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

Hoffe das hilft jedem, der xChickenx sucht

UPDATE Mit diesem Konverter ist hier die C # -Version:

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

Die Frage benötigt eine C # -Antwort, da sie auf diese Weise markiert ist.
Mathias Lykkegaard Lorenzen

@MathiasLykkegaardLorenzen Es gibt mehrere Freeware-Apps, die .NET-Code in alle Sprachen übersetzen können. Es gibt sogar Online-Apps.
Ognyan Dimitrov

1
Punkt genommen. Ich hätte meine Stimme geändert, kann es aber nicht, da sie gesperrt ist.
Mathias Lykkegaard Lorenzen

SCHLECHTE IDEE! Wenn Sie eine Datenbank löschen, wenn sie deaktiviert ist, werden die Datenbankdateien nicht entfernt! Auch wenn dies in einem besonderen Fall nützlich sein könnte, ist es kein Muster, dem Sie blind folgen sollten. Probleme: a) Ihre Festplatte wird gefüllt und b) Sie könnten auf Probleme stoßen, wenn Sie versuchen, die Datenbank mit denselben physischen Dateien neu zu erstellen.
Stefan Steinegger

0

Sie können eine aktuell verwendete sp_detach_dbDatenbank nicht löschen. Sie können jedoch eine gespeicherte Prozedur verwenden, wenn Sie eine Datenbank vom Server entfernen möchten, ohne die Datenbankdateien zu löschen.


0

Nur die DB umzubenennen (um gelöscht zu werden) hat den Trick für mich getan. Es kam aus dem Laderaum eines beliebigen Prozesses, der auf die Datenbank zugegriffen hatte, und so konnte ich die Datenbank löschen.


0

Gehen Sie zum Abschnitt Verfügbare Datenbanken und wählen Sie Master aus. Versuchen Sie dann DROP DATABASE the_DB_name.


0

Um eine Datenbank zu löschen, auch wenn sie ausgeführt wird, können Sie diese Batchdatei verwenden

@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

Bildschirm


0

Überprüfen Sie zuerst die verbundenen Datenbanken

SP_WHO

Zweitens Trennen Sie Ihre Datenbank

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)

ENDLICH TROPFEN

drop database your_database
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.