A veces los problemas más estupidos para nosotros pueden ser realmente complejos para nuestros clientes.
El otro dia un cliente nos abrió un ticket para decirnos que estaban haciendo pruebas con una base de datos de test y «la base de datos se habia cambiado a SINGLE_USER» (supongo que se cambió sóla obviamente sin que ellos lo hicieran…) y nos pedian ayuda para cambiarla de vuelta a MULTI_USER.
La forma más sencilla, y la que probablemente el cliente haya probado es a hacer click derecho sobre la base de datos, ir a las opciones y cambiarla de nuevo a MULTI_USER, pero esto podria no ser posible si la base de datos está en uso.
Para solucionar esto, os traigo un pequeño script que os va a ayudar a solucionar este problema rapidamente.
Matar todas las conexiones a una base de datos en SQL Server
Creo que el titulo se explica por si sólo, sólo teneis que modificar el nombre de la base de datos para matar todas las conexiones existentes a esta. Lo tengo para varias versiones de SQL Server.
2012 o más nuevas
USE [master]; DECLARE @kill varchar(8000) = ''; SELECT @kill = @kill + 'kill ' + CONVERT(varchar(5), session_id) + ';' FROM sys.dm_exec_sessions WHERE database_id = db_id('BaseDeDatos') EXEC(@kill);
Anteriores a 2012
USE master; DECLARE @kill varchar(8000); SET @kill = ''; SELECT @kill = @kill + 'kill ' + CONVERT(varchar(5), spid) + ';' FROM master..sysprocesses WHERE dbid = db_id('BaseDeDatos') EXEC(@kill);
OK, una vez que ya tenemos esto pasemos al siguiente paso.
Cambiar base de datos en uso a MULTI_USER
Lo que haremos ahora será juntar en una misma query uno de los scripts anteriores para matar las conexiones con la query encargada de cambiar el modo de MULTI_USER a SINGLE_USER. Se veria de esta forma.
USE [master]; DECLARE @kill varchar(8000) = ''; SELECT @kill = @kill + 'kill ' + CONVERT(varchar(5), session_id) + ';' FROM sys.dm_exec_sessions WHERE database_id = db_id('BaseDeDatos') EXEC(@kill); GO ALTER DATABASE [BaseDeDatos] SET MULTI_USER
Mi recomendación es que primero selecciones y ejecuteis el script para matar las conexiones e inmediatamente después hagais lo mismo con la otra parte, pero en teoria podriais ejecutarlo todo al mismo tiempo y deberia funcionar.
Y esto es todo, una solución simple para un problema simple.