Impossibile eliminare il database perché è attualmente in uso


91

Voglio eliminare un database. Ho usato il codice seguente, ma senza risultati.

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

Ricevo l'errore perché non è possibile eliminare il database perché è attualmente in uso . Per favore aiutami nel problema sopra menzionato.

Risposte:


56

Qualcuno si è connesso al database. Prova a passare a un altro database e quindi a rilasciarlo:

Provare

SP_WHO per vedere chi si è connesso

e KILLse necessario


16
Per SQL Server mgmt. studio: fare clic con il tasto destro del mouse sul database: Proprietà -> Opzioni -> Limita accesso: impostare su "Utente singolo" ed eseguire il rilascio in seguito.
AceAlfred

invoke-sqlcmd -ServerInstance localhost 'exec sp_who' | where-object {$ _. dbname -eq 'myDbName'} non restituisce nulla. Eppure finché non si lamenta. Questo non sembra funzionare davvero.
Pxtl

1
@AceAlfred Yours è il più facile tra tutti. Avrebbe dovuto essere una delle risposte. Grazie.
Amit Ray,

114

prima di rilasciare un database, si interrompe prima la connessione a quel database.

Ho trovato una soluzione su 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 Mi chiedo perché non l'hai ricevuto prima, questa è una risposta molto utile. Grazie
Mehdi LAMRANI

Questo non porterà anche processi non utente?
monaco

Da parte mia ottengo l'errore "Il comando KILL non può essere utilizzato nelle transazioni dell'utente".
Alleato

Se la transazione sta causando un problema, non utilizzare la transazione.
Don Rolling

Cordiali saluti, questo sembra fare quello che hai detto, ma non sta risolvendo il problema per me.
Don Rolling

44

Per SQL Server mgmt. studio:

Database clic destro: Proprietà -> Opzioni -> Limita accesso: impostare su "Utente singolo" ed eseguire il rilascio in seguito


Se vuoi eliminare un database direttamente da Management Studio, questa è la soluzione più intuitiva. Grazie.
André Pena

L'ho fatto e poi usato drop database myDatabase. Non ha risolto il problema. si è verificato lo stesso errore ( ... it is currently is use).
Shahryar Saljoughi

41

È troppo tardi, ma potrebbe essere utile per i futuri utenti.

È possibile utilizzare la query seguente prima di rilasciare la query del database:

 alter database [MyDatbase] set single_user with rollback immediate

 drop database [MyDatabase]

Funzionerà. Puoi anche fare riferimento a

Come faccio a specificare "chiudere le connessioni esistenti" nello script sql

Spero che ti possa aiutare :)


1
non dimenticare di aggiungere anche questo all'inizio use master go se attualmente selezioni [MyDatabase]
Thành Chung Bùi

1
@ ThànhChungBùi quello che hai indicato ha risolto il mio problema. Dovrebbe essere incluso nelle risposte. Grazie.
Shahryar Saljoughi

31

In SQL Server Management Studio 2016, eseguire le operazioni seguenti:

  • Fare clic con il tasto destro sul database

  • Fare clic su Elimina

  • Verificare la chiusura delle connessioni esistenti

  • Eseguire l'operazione di cancellazione


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

(Sostituisci "Test" con il nome del database che stai tentando di eliminare) Questo ti dirà quali processi lo stanno utilizzando.

Se vuoi comunque forzare la caduta, l'approccio definitivo è:

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

Spero che sia di aiuto !


1
Signore mi ha salvato la giornata;) Niente di quanto sopra ha funzionato nel mio caso, i tuoi suggerimenti hanno funzionato come descritto!
Dimitri

8

Per prima cosa rendi offline il tuo database, dopodiché scollegalo ad es

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

Non credo che l'azione cancelli il database.
snp.it

2
dopo aver scollegato il database ora è pronto per essere cancellato con questa query. DROP DATABASE dbname;
Hidayat Arghandabi,

7

Se rilasci il database in SQL Management Studio e ricevi il messaggio, non dimenticare di utilizzare Master come database selezionato, altrimenti la tua query è anche una connessione al database.

USE Master;
GO
DROP DATABASE AdventureWorks;
GO

Nel mio caso avevo più di 1 connessione al DB II che volevo interrompere.
AlexMelw

3

Una soluzione alternativa alla forza bruta potrebbe essere:

  1. Arresta il servizio SQL Server.

  2. Elimina i file .mdf e .ldf corrispondenti.

  3. Avvia il servizio SQL Server.

  4. Connettiti con SSMS ed elimina il database.


Per me funziona. Grazie. Penso che il problema sia un disco rigido esterno. Ho cambiato il file su un disco locale. Grazie per la tua soluzione.
InfZero

2

Volevo sottolineare che ho utilizzato uno script derivato da due delle risposte seguenti.

Puntelli a @Hitesh Mistry e @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]]]

2

Per prima cosa controlla i database collegati

SP_WHO

Secondo Disconnetti il ​​tuo database

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)

FINALMENTE LASCIARLO

drop database your_database

1

Utilizzando MS SQL Server 2008, nella finestra di dialogo ELIMINA con le opzioni di chiusura della connessione, questo è lo script generato, immagino sia il migliore:

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

Questo è ciò che SQL Server Management Studio scrive e cosa succede per me. L'unica cosa che ho fatto diversamente è stata racchiudere tutto ciò all'interno di unUSE [master] IF EXISTS(SELECT * FROM sys.databases WHERE name = 'Database_Name') BEGIN -- your script here END
Smitty-Werben-Jager-Manjenson

1

Volevo solo dare un vb.net (come con il linguaggio C se vuoi convertire ..) Stavo avendo un problema simile per la disinstallazione di uno dei miei programmi, rilasciare il DB era un po 'complicato, sì, poteva convincere gli utenti ad andare nel server rilasciarlo usando Express, ma non è pulito, dopo pochi sguardi ho ottenuto un po 'di codice perfetto insieme ...

    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

Spero che questo aiuti chiunque cerchi xChickenx

AGGIORNAMENTO Usando questo convertitore ecco la versione 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);
        }
    }

La domanda necessita di una risposta C #, poiché è contrassegnata in questo modo.
Mathias Lykkegaard Lorenzen

@MathiasLykkegaardLorenzen ci sono diverse app freeware in grado di tradurre il codice .NET in tutte le lingue. Ci sono anche app online.
Ognyan Dimitrov

1
Punto preso. Avrei cambiato il mio voto, ma non posso, perché è bloccato.
Mathias Lykkegaard Lorenzen

CATTIVA IDEA! L'eliminazione di un database quando è offine non rimuoverà i file del database! Anche se questo potrebbe essere utile in qualche caso speciale, non è uno schema che dovresti seguire ciecamente. Problemi: a) il tuo disco si riempie eb) potresti incorrere in problemi quando provi a ricreare il database usando gli stessi file fisici.
Stefan Steinegger

1

Per eliminare un database anche se è in esecuzione, puoi utilizzare questo file batch

@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

Schermo


1
L'idea con la modalità utente singolo sembra essere il modo più pulito per farlo.
Gucu112

0

Non è possibile eliminare un database attualmente in uso, tuttavia è possibile utilizzare la sp_detach_dbprocedura memorizzata se si desidera rimuovere un database dal server senza eliminare i file del database.


0

semplicemente rinominare il DB (da eliminare) ha fatto il trucco per me. è uscito dal blocco di qualsiasi processo stesse accedendo al database, quindi sono stato in grado di eliminare il database.


0

Vai alla sezione database disponibili e seleziona master. Quindi prova DROP DATABASE the_DB_name.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.