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«
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.
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