Quando tento descartar um banco de dados, recebo o erro "Não é possível descartar o banco de dados "dbname" porque está em uso no momento". No entanto, quando executo sp_who2
, definitivamente não há sessões conectadas a esse banco de dados. Eu também configurei o banco de dados para single_user mode with rollback immediate
.
Por que isso está acontecendo?
Uma sessão conectada a outro banco de dados pode ter uma transação aberta que também afeta seu banco de dados - sp_who2 mostrará apenas um banco de dados. Também pode ser algo tão simples quanto Pesquisador de Objetos ou Detalhes do Pesquisador de Objetos abertos no SSMS, que novamente mostraria apenas um banco de dados em sp_who2.
Não se preocupe em tentar encontrar a sessão responsável; apenas mate todos eles com uma instrução (e certifique-se de que não é sua cópia do SSMS que está conectada, por exemplo, outra janela de consulta, Pesquisador de Objetos etc.):
Agora você poderá soltá-lo e fazer isso usando DDL, não a interface do usuário:
Certifique-se de não ter dependências como instantâneos de banco de dados no banco de dados que deseja remover. No entanto, a mensagem de erro seria diferente. Você tem certeza de que não há nenhum processo oculto que está se conectando ao seu banco de dados? Uma boa abordagem seria executar um script que mata todas as sessões e imediatamente após renomear o banco de dados para outro nome e depois descartar o banco de dados.
crie um cursor com base neste select:
problema dentro do cursor:
após o cursor ser fechado e desalocado:
Que tal apenas ver o que o SSMS faz quando você usa a interface do usuário, mas diz a ele para emitir um script para a ação? Aqui está o que o SSMS faz quando você clica com o botão direito do mouse no banco de dados e escolhe Excluir e, em seguida, marque a caixa para fechar as conexões existentes:
Qual é o seu banco de dados atual quando você emite o
DROP
comando? Tente isto:Certifique-se também de estar conectado como
sa
e nãodbo
em qualquer banco de dados que deseja eliminar.Eu enfrentei essa situação muitas vezes e abaixo está o que eu faço:
Quando métodos óbvios não funcionam ..... (assim como na sua situação):
Descubra o ID do banco de dados de sysdatabases.
Em seguida, execute -
sp_lock
que mostrará todos os bloqueios na instância junto com spid e dbid.Mate os spids com o dbid que você está tentando desligar ou soltar.
Embora o processo seja um pouco manual, ele pode ser automatizado conforme abaixo:
Encontrei uma resposta realmente simples no StackOverflow que funcionou pela primeira vez para mim:
https://stackoverflow.com/a/7469167/261405
Aqui está o SQL dessa resposta: