No se puede quitar la base de datos porque está actualmente en uso

89

Quiero eliminar una base de datos. He utilizado el siguiente código, pero fue en vano.

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

Recibo un error porque no se puede eliminar la base de datos porque está actualmente en uso . Ayúdame con el problema mencionado anteriormente.

sachin kulkarni
fuente

Respuestas:

55

Alguien conectado a la base de datos. Intente cambiar a otra base de datos y luego, soltarla:

Tratar

SP_WHO para ver quien se conectó

y KILLsi es necesario

Gregory Nozik
fuente
14
Para el servidor SQL mgmt. studio: Haga clic con el botón derecho en la base de datos: Propiedades -> Opciones -> Restringir acceso: establezca "Usuario único" y realice la eliminación después.
AceAlfred
invoke-sqlcmd -ServerInstance localhost 'exec sp_who' | where-object {$ _. dbname -eq 'myDbName'} no devuelve nada. Sin embargo, hasta se queja. Esto no parece funcionar realmente.
Pxtl
112

antes de descartar una base de datos, primero descarta la conexión a esa base de datos.

Encontré una solución en 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)
chico sin reglas
fuente
1
+1 Me pregunto por qué no recibiste esto antes, esta es una respuesta muy útil. Gracias
Mehdi LAMRANI
¿No traerá eso también procesos que no son de usuario?
monksy
En mi caso, aparece el error "El comando KILL no se puede utilizar dentro de las transacciones del usuario".
Ally
Si la transacción está causando un problema, no use la transacción.
Don Rolling
FYI, esto parece hacer lo que dijiste que haría, pero no me está resolviendo el problema.
Don Rolling
42

Para el servidor SQL mgmt. estudio:

Haga clic con el botón derecho en la base de datos: Propiedades -> Opciones -> Restringir acceso: establezca en "Usuario único" y realice la eliminación después

AceAlfred
fuente
Si desea eliminar una base de datos directamente desde Management Studio, esta es la solución más intuitiva. Gracias.
André Pena
Lo hice y luego lo usé drop database myDatabase. No solucionó el problema. el mismo error ( ... it is currently is use) sucedió.
Shahryar Saljoughi
40

Es demasiado tarde, pero puede ser útil para futuros usuarios.

Puede usar la siguiente consulta antes de descartar la consulta de la base de datos:

 alter database [MyDatbase] set single_user with rollback immediate

 drop database [MyDatabase]

Funcionará. También puede consultar

¿Cómo especifico "cerrar conexiones existentes" en el script SQL?

Espero que te ayude :)

Hitesh
fuente
1
no olvide agregar esto al principio use master go también si actualmente selecciona [MyDatabase]
Thành Chung Bùi
1
@ ThànhChungBùi lo que señaló resolvió mi problema. Debe incluirse en las respuestas. Gracias.
Shahryar Saljoughi
29

En SQL Server Management Studio 2016, realice lo siguiente:

  • Haga clic derecho en la base de datos

  • Haga clic en eliminar

  • Compruebe cerrar las conexiones existentes

  • Realizar operación de eliminación

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

(Reemplace 'Prueba' con el nombre de la base de datos que está intentando eliminar) Esto le dirá qué procesos la están usando.

Si aún desea forzar la caída, el enfoque definitivo es:

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

Espero que esto ayude !

Raza
fuente
Usted señor me salvó el día;) Nada de lo anterior funcionó en mi caso, ¡sus sugerencias funcionaron como se describe!
Dimitri
8

Primero haga que su base de datos esté fuera de línea, luego sepárela,

Use Master
GO
ALTER DATABASE dbname SET OFFLINE
GO
EXEC sp_detach_db 'dbname', 'true'
Abhishek Upadhyay
fuente
No creo que la acción elimine la base de datos.
snp.it
1
después de separar la base de datos, ahora está lista para ser eliminada con esta consulta. DROP DATABASE dbname;
Hidayat Arghandabi
6

Si suelta la base de datos en SQL Management Studio y recibe el mensaje, no olvide que usa Master como base de datos seleccionada; de lo contrario, su consulta también es una conexión a la base de datos.

USE Master;
GO
DROP DATABASE AdventureWorks;
GO
LockTar
fuente
En mi caso, tenía más de 1 conexión al DB II que quería desconectar.
AlexMelw
3

Una solución alternativa de fuerza bruta podría ser:

  1. Detenga el servicio de SQL Server.

  2. Elimine los archivos .mdf y .ldf correspondientes.

  3. Inicie el servicio de SQL Server.

  4. Conéctese con SSMS y elimine la base de datos.

HerbalMart
fuente
Esto funciona para mi. Gracias. Creo que el problema es un disco duro externo. Cambié el archivo a un disco local. Gracias por tu solucion
InfZero
2

Quería decir que utilicé un script que se deriva de dos de las respuestas a continuación.

Apoyos para @Hitesh Mistry y @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]]]
Don Rolling
fuente
1

Usando MS SQL Server 2008, en el cuadro de diálogo ELIMINAR con opciones de conexión Cerrar, este es el script generado, supongo que es el mejor:

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
Luke Vo
fuente
Esto es lo que hacen los scripts de SQL Server Management Studio y lo que me funciona. Lo único que hice de manera diferente fue envolver todo eso dentro de unUSE [master] IF EXISTS(SELECT * FROM sys.databases WHERE name = 'Database_Name') BEGIN -- your script here END
Smitty-Werben-Jager-Manjenson
1

Solo quería dar un vb.net (como con el lenguaje c si quiero convertir ...) Estaba teniendo un problema similar para desinstalar uno de mis programas, soltar la base de datos fue un poco complicado, sí, podría hacer que los usuarios ingresen al servidor. usando Express, pero eso no está limpio, después de algunas miradas alrededor, obtuve un poco de código perfecto ...

    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

Espero que esto ayude a cualquiera que busque xChickenx

ACTUALIZAR Usando este convertidor aquí está la versión 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);
        }
    }
Pollo
fuente
La pregunta necesita una respuesta de C #, ya que está etiquetada de esa manera.
Mathias Lykkegaard Lorenzen
@MathiasLykkegaardLorenzen hay varias aplicaciones gratuitas que pueden traducir código .NET en todos los idiomas. Incluso hay aplicaciones en línea.
Ognyan Dimitrov
1
Punto a favor. Hubiera cambiado mi voto, pero no puedo porque está bloqueado.
Mathias Lykkegaard Lorenzen
¡MALA IDEA! Dejar caer una base de datos cuando está fuera de línea no eliminará los archivos de la base de datos. Incluso si esto puede ser útil en algún caso especial, no es un patrón que deba seguir ciegamente. Problemas: a) su disco se llena yb) es posible que tenga problemas al intentar recrear la base de datos utilizando los mismos archivos físicos.
Stefan Steinegger
1

Primero verifique las bases de datos conectadas

SP_WHO

Segundo desconecta tu base de datos

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 DEJARLO

drop database your_database
Sajid Khan
fuente
0

No puede eliminar una base de datos que se esté utilizando actualmente, sin embargo, puede utilizar el sp_detach_dbprocedimiento almacenado si desea eliminar una base de datos del servidor sin eliminar los archivos de la base de datos.

adatapost
fuente
0

simplemente cambiar el nombre de la base de datos (para eliminarlo) hizo el truco para mí. se liberó de cualquier proceso que estuviera accediendo a la base de datos, por lo que pude eliminar la base de datos.

AceMark
fuente
0

Vaya a la sección de bases de datos disponibles y seleccione master. Luego prueba DROP DATABASE the_DB_name.


fuente
0

Para eliminar una base de datos incluso si se está ejecutando, puede usar este archivo por lotes

@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

Pantalla

Alper Ebicoglu
fuente