Verifique se você não possui dependências, como instantâneos de banco de dados no banco de dados que deseja remover. Porém, a mensagem de erro pareceria 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, em seguida, descartá-lo.
crie um cursor com base nessa seleção:
select d.name , convert (smallint, req_spid) As spid
from master.dbo.syslockinfo l,
master.dbo.spt_values v,
master.dbo.spt_values x,
master.dbo.spt_values u,
master.dbo.sysdatabases d
where l.rsc_type = v.number
and v.type = 'LR'
and l.req_status = x.number
and x.type = 'LS'
and l.req_mode + 1 = u.number
and u.type = 'L'
and l.rsc_dbid = d.dbid
and rsc_dbid = (select top 1 dbid from
master..sysdatabases
where name like 'my_db')
problema dentro do cursor:
SET @kill_process = 'KILL ' + @spid
EXEC master.dbo.sp_executesql @kill_process
PRINT 'killed spid : '+ @spid
após o cursor ser fechado e desalocado:
sp_dboption 'my_db', 'single user', 'TRUE'
go
sp_renamedb 'my_db', 'my_db_old'
go
DROP DATABASE MY_DB_OLD
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 poderia ser algo tão simples quanto o Pesquisador de Objetos ou Detalhes do Pesquisador de Objetos aberto no SSMS, que novamente mostraria apenas um banco de dados em sp_who2.
Não se preocupe em tentar encontrar a sessão que é responsável; basta matá-los todos com uma declaração (e verifique se não está sua cópia do SSMS conectada, por exemplo, outra janela de consulta, Pesquisador de Objetos etc.):
Agora você poderá descartá-lo e fazer isso usando DDL, não a interface do usuário:
fonte
USE master
entãoDROP DATABASE dbname
. Aparentemente, tudo o que é necessário é apenas "usar" outra coisa, para liberar o banco de dados.Qual é o seu banco de dados atual quando você emite o
DROP
comando? Tente o seguinte:Verifique também se você está conectado como
sa
e nãodbo
no banco de dados que deseja soltar.fonte
Que tal ver o que o SSMS faz quando você usa a interface do usuário, mas diz para ele 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 DB e escolhe Excluir, depois marque a caixa para fechar as conexões existentes:
fonte
Eu já enfrentei essa situação muitas vezes e abaixo está o que eu faço:
Quando métodos óbvios não funcionam ... (como na sua situação):
Descubra o ID do banco de dados em sysdatabases.
Em seguida, execute -
sp_lock
que mostrará todos os bloqueios na instância, juntamente com spid e dbid.Mate os spids com o dbid que você está tentando desconectar ou desconectar.
Embora o processo seja um pouco manual, ele pode ser automatizado como abaixo:
fonte
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:
fonte