Eliminar conexiones hacia una base de datos – Microsoft SQL Server

bd¡Hola a todos!

En ocasiones, es útil poder eliminar las conexionas hacia una base de datos, por ejemplo cuando se quiere hacer una restauración de la misma… Siempre puede quedar alguna aplicación, algún usuario o alguna referencia a dicha base de datos que no permita realizar la restauración. Obviamente, si vamos a restaurar una base de datos de producción, ¡debemos de estar seguros de lo que estamos haciendo!.

El mensaje que aparece cuando esta siendo usada la base de datos es: «Error en la restauración de la base de datos… No se pudo obtener acceso exclusivo porque la base de datos está en uso«

b02

En éste caso, obviamente con el Management Studio se tiene abierto una Consulta en dicha base de datos y esto significa que tiene un SPID activo (es la razón de que no se tenga acceso exclusivo a la BD para su restauración).

Para esto, les propongo un script con el que se puede «forzar» la eliminación de las conexiones a dicha BD y así poder hacer la restauración (o para otro fin que lo necesiten). A continuación, el script completo y solo se explicará lo que esta en negrita.

USE master
GO
 
SET NOCOUNT ON
DECLARE @DBName varchar(50)
DECLARE @spidstr varchar(8000)
DECLARE @ConnKilled smallint
SET @ConnKilled=0
SET @spidstr = ''
 
Set @DBName = 'MI_BASE_DE_DATOS'
IF db_id(@DBName) < 4
BEGIN
PRINT 'Las conexiones a la base de datos de sistema no puedes ser eliminadas.'
RETURN
END
SELECT @spidstr=coalesce(@spidstr,',' )+'kill '+convert(varchar, spid)+ '; '
FROM master..sysprocesses WHERE dbid=db_id(@DBName)
 
IF LEN(@spidstr) > 0
BEGIN
EXEC(@spidstr)
SELECT @ConnKilled = COUNT(1)
FROM master..sysprocesses WHERE dbid=db_id(@DBName)
END

Mencionar que se debe de estar en la BD Master para que funcione (aunque en el mismo script obligamos a usarla xD ). Lo único que hay que modificar del script, es el nombre de la BD a la cual queremos eliminar las conexiones; o sea, MI_BASE_DE_DATOS.

b01

Cuando se ha ejecutado correctamente, se recibe como resultado un mensaje que dice «Comandos completados correctamente».

Otra forma de hacer esto de una forma más manual, sería mediante sp_who2 y kill pero es algo manual el proceso… y hay que tener un buen ojo. En una entrada anterior (Bloqueos en SQL Server y cómo afrontarlos) se mira un poco referente a éstos dos comandos mencionados.

Bien, eso es todo. ¡Saludos!

Comentarios por Facebook

comentarios

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*