Asegúrese de que no tiene dependencias como instantáneas de base de datos en la base de datos que desea eliminar. Sin embargo, el mensaje de error sería diferente. ¿Estás seguro de que no hay ningún proceso oculto que se conecte a tu base de datos? Un buen enfoque sería ejecutar un script que mate todas las sesiones e inmediatamente después de cambiar el nombre de la base de datos a otro nombre y luego soltar la base de datos.
crear un cursor basado en esta selección:
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 del cursor:
SET @kill_process = 'KILL ' + @spid
EXEC master.dbo.sp_executesql @kill_process
PRINT 'killed spid : '+ @spid
después de cerrar el cursor y desasignarlo:
sp_dboption 'my_db', 'single user', 'TRUE'
go
sp_renamedb 'my_db', 'my_db_old'
go
DROP DATABASE MY_DB_OLD
Una sesión conectada a otra base de datos puede tener una transacción abierta que también afecta a su base de datos: sp_who2 solo mostrará una base de datos. También podría ser algo tan simple como el Explorador de objetos o los Detalles del Explorador de objetos abiertos en SSMS, que nuevamente solo mostrarían una base de datos en sp_who2.
No te molestes en tratar de encontrar la sesión responsable; simplemente mátelos a todos con una declaración (y asegúrese de que no esté conectada su copia de SSMS, por ejemplo, otra ventana de consulta, Object Explorer, etc.):
Ahora podrá soltarlo y hacerlo utilizando DDL, no la interfaz de usuario:
fuente
USE master
, entoncesDROP DATABASE dbname
. Aparentemente, todo lo que se necesita es simplemente "usar" algo más, para liberar el db.¿Cuál es su base de datos actual cuando emite el
DROP
comando? Prueba esto:También asegúrese de estar conectado como
sa
y nodbo
en la base de datos que desea soltar.fuente
¿Qué tal simplemente ver lo que hace SSMS cuando usa la interfaz de usuario pero le dice que emita un script para la acción? Esto es lo que hace SSMS cuando hace clic derecho en la base de datos y selecciona Eliminar, luego marca la casilla para cerrar las conexiones existentes:
fuente
Me he enfrentado a esta situación muchas veces y a continuación es lo que hago:
Cuando los métodos obvios no funcionan ..... (como en su situación):
Encuentre el ID de la base de datos de sysdatabases
Luego ejecute:
sp_lock
eso mostrará todos los bloqueos en la instancia junto con spid y dbid.Mata a los spids con el dbid que estás intentando desconectar o soltar.
Sin embargo, el proceso es un poco manual, se puede automatizar de la siguiente manera:
fuente
Encontré una respuesta realmente simple en StackOverflow que funcionó por primera vez para mí:
https://stackoverflow.com/a/7469167/261405
Aquí está el SQL de esa respuesta:
fuente