Não é possível descartar o banco de dados porque ele está em uso


91

Eu quero eliminar um banco de dados. Usei o código a seguir, mas sem sucesso.

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

Estou recebendo um erro porque não é possível descartar o banco de dados porque ele está em uso . Por favor me ajude na questão mencionada acima.

Respostas:


56

Alguém conectado ao banco de dados. Tente mudar para outro banco de dados e, em seguida, descartá-lo:

Experimentar

SP_WHO para ver quem conectou

e KILLse necessário


16
Para gerenciamento de servidor SQL. studio: Clique com o botão direito do mouse no banco de dados: Propriedades -> Opções -> Restringir acesso: defina como "Único usuário" e execute a remoção em seguida.
AceAlfred

invoke-sqlcmd -ServerInstance localhost 'exec sp_who' | where-object {$ _. dbname -eq 'myDbName'} não retorna nada. Ainda assim, até reclama. Isso não parece realmente funcionar.
Pxtl

1
@AceAlfred Yours é o mais fácil de todos. Deveria ter sido uma das respostas. Obrigado.
Amit Ray

114

antes de eliminar um banco de dados, você primeiro elimina a conexão com esse banco de dados.

Encontrei uma solução em 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 Eu me pergunto por que você não entendeu isso antes, esta é uma resposta muito útil. Obrigado
Mehdi LAMRANI

Isso não trará também processos não-usuários?
monksy

Para mim, recebo o erro "O comando KILL não pode ser usado nas transações do usuário."
Ally

Se a transação estiver causando um problema, não use a transação.
Don Rolling

Para sua informação, isso parece fazer o que você disse que faria, mas não está resolvendo o problema para mim.
Don Rolling

44

Para gerenciamento de servidor SQL. estúdio:

Clique com o botão direito do mouse no banco de dados: Propriedades -> Opções -> Restringir acesso: defina como "Único usuário" e execute a eliminação em seguida


Se você deseja excluir um banco de dados diretamente do Management Studio, esta é a solução mais intuitiva. Obrigado.
André Pena

Eu fiz e depois usei drop database myDatabase. Não resolveu o problema. o mesmo erro ( ... it is currently is use) ocorreu.
Shahryar Saljoughi

41

É tarde demais, mas pode ser útil para futuros usuários.

Você pode usar a consulta abaixo antes de descartar a consulta do banco de dados:

 alter database [MyDatbase] set single_user with rollback immediate

 drop database [MyDatabase]

Vai funcionar. Você também pode se referir a

Como faço para especificar "fechar conexões existentes" no script sql

Espero que ajude você :)


1
não se esqueça de adicionar também no início use master go se você selecionar atualmente [MeuBanco de Dados]
Thành Chung Bùi

1
@ ThànhChungBùi o que você apontou resolveu meu problema. Deve ser incluído nas respostas. Obrigado.
Shahryar Saljoughi

31

No SQL Server Management Studio 2016, execute o seguinte:

  • Clique com o botão direito no banco de dados

  • Clique em deletar

  • Verifique fechar as conexões existentes

  • Executar operação de exclusão


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

(Substitua 'Teste' pelo nome do banco de dados que você está tentando eliminar) Isso informará quais processos estão usando.

Se você ainda quiser forçar a queda, a abordagem final é:

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

Espero que isto ajude !


1
O senhor salvou meu dia;) Nada do acima funcionou no meu caso, suas sugestões funcionaram conforme descrito!
Dimitri

8

Em primeiro lugar, coloque a sua base de dados offline e depois desanexe-a, por exemplo

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

Eu não acho que a ação exclui o banco de dados.
snp.it

2
depois de desanexar o banco de dados agora está pronto para ser excluído com esta consulta. DROP DATABASE dbname;
Hidayat Arghandabi

7

Se você está descartando o banco de dados no SQL Management Studio e recebe a mensagem, não se esqueça de usar o Master como banco de dados selecionado, caso contrário, sua consulta também será uma conexão com o banco de dados.

USE Master;
GO
DROP DATABASE AdventureWorks;
GO

Eu meu caso tinha mais de 1 conexão com o DB II queria cair.
AlexMelw de

3

Uma solução alternativa de força bruta pode ser:

  1. Pare o serviço SQL Server.

  2. Exclua os arquivos .mdf e .ldf correspondentes.

  3. Inicie o serviço SQL Server.

  4. Conecte-se ao SSMS e exclua o banco de dados.


Funciona para mim. Obrigado. Acho que o problema é um disco rígido externo. Troquei o arquivo para um disco local. Obrigado pela sua solução.
InfZero

2

Queria alertar que usei um script derivado de duas das respostas abaixo.

Acessórios para @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

Primeiro verifique os bancos de dados conectados

SP_WHO

Segundo Desconecte seu banco de dados

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 CAIR

drop database your_database

1

Usando o MS SQL Server 2008, na caixa de diálogo DELETE com opções Fechar conexão, este é o script gerado, acho que é o melhor:

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

Isso é o que o SQL Server Management Studio cria e o que funciona para mim. A única coisa que fiz diferente foi embrulhar tudo isso dentro de umUSE [master] IF EXISTS(SELECT * FROM sys.databases WHERE name = 'Database_Name') BEGIN -- your script here END
Smitty-Werben-Jager-Manjenson

1

Só queria dar um vb.net (como acontece com a linguagem c se quiser converter ..) Eu estava tendo problema semelhante para desinstalar um dos meus programas, derrubar o banco de dados foi um pouco complicado, sim poderia fazer os usuários irem para o servidor largá-lo usando Express, mas isso não está limpo, depois de algumas análises, conseguimos um pequeno código perfeito junto ...

    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 isso ajude alguém procurando xChickenx

ATUALIZAÇÃO Usando este conversor aqui está a versão 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);
        }
    }

A pergunta precisa de uma resposta C #, pois é marcada dessa forma.
Mathias Lykkegaard Lorenzen

@MathiasLykkegaardLorenzen existem vários aplicativos freeware que podem traduzir código .NET em todos os idiomas. Existem até aplicativos online.
Ognyan Dimitrov

1
Ponto tomado. Eu teria mudado meu voto, mas não posso, porque está bloqueado.
Mathias Lykkegaard Lorenzen

PÉSSIMA IDEIA! Eliminar um banco de dados quando ele está off-line não removerá os arquivos do banco de dados! Mesmo que isso possa ser útil em algum caso especial, não é um padrão que você deva seguir cegamente. Problemas: a) seu disco fica cheio eb) você pode ter problemas ao tentar recriar o banco de dados usando os mesmos arquivos físicos.
Stefan Steinegger

1

Para excluir um banco de dados, mesmo se ele estiver em execução, você pode usar este arquivo em lote

@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

Tela


1
A ideia com o modo de usuário único parece ser a maneira mais limpa de fazer isso.
Gucu112

0

Você não pode eliminar um banco de dados que está sendo usado atualmente, no entanto, você pode usar o sp_detach_dbprocedimento armazenado se desejar remover um banco de dados do servidor sem excluir os arquivos do banco de dados.


0

apenas renomear o banco de dados (para ser excluído) funcionou para mim. ele saiu do controle de qualquer processo que estava acessando o banco de dados e, portanto, fui capaz de descartá-lo.


0

Vá para a seção de bancos de dados disponíveis e selecione mestre. Em seguida, tente DROP DATABASE the_DB_name.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.