¿Cómo se eliminan todas las conexiones actuales a una base de datos SQL Server 2005

sql-server sql-server-2005


Quiero renombrar una base de datos,pero sigue apareciendo el error de que "no se pudo conseguir el bloqueo exclusivo" en la base de datos,lo que implica que hay alguna conexión(es)todavía activa(s).

¿Cómo puedo eliminar todas las conexiones a la base de datos para poder renombrarla?




Answer 1 SQLMenace


La razón por la que el enfoque que sugirió Adam no funcionará es que durante el tiempo que está pasando por las conexiones activas se puede establecer una nueva, y las perderá. En su lugar, podría utilizar el siguiente enfoque que no tiene este inconveniente:

-- set your current connection to use master otherwise you might get an error

use master
ALTER DATABASE YourDatabase SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

--do you stuff here 

ALTER DATABASE YourDatabase SET MULTI_USER



Answer 2 Adam


Guión para lograr esto,reemplazar 'DB_NAME' con la base de datos para matar todas las conexiones a:

USE master
GO

SET NOCOUNT ON
DECLARE @DBName varchar(50)
DECLARE @spidstr varchar(8000)
DECLARE @ConnKilled smallint
SET @ConnKilled=0
SET @spidstr = ''

Set @DBName = 'DB_NAME'
IF db_id(@DBName) < 4
BEGIN
PRINT 'Connections to system databases cannot be killed'
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



Answer 3 btk


Mátalo,y mátalo con fuego:

USE master
go

DECLARE @dbname sysname
SET @dbname = 'yourdbname'

DECLARE @spid int
SELECT @spid = min(spid) from master.dbo.sysprocesses where dbid = db_id(@dbname)
WHILE @spid IS NOT NULL
BEGIN
EXECUTE ('KILL ' + @spid)
SELECT @spid = min(spid) from master.dbo.sysprocesses where dbid = db_id(@dbname) AND spid > @spid
END



Answer 4 Joseph Daigle


Usando el SQL Management Studio Express:

En el árbol del Explorador de Objetos profundiza en la Gestión hasta "Monitor de Actividad" (si no lo encuentras allí,haz clic con el botón derecho del ratón en el servidor de la base de datos y selecciona "Monitor de Actividad").Abriendo el Monitor de Actividad,puedes ver toda la información del proceso.Deberías poder encontrar los bloqueos de la base de datos que te interesan y eliminarlos,lo que también eliminará la conexión.

Deberías poder cambiar el nombre después de eso.




Answer 5 brendan


Siempre he usado:


ALTER DATABASE DB_NAME SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
GO 
SP_RENAMEDB 'DB_NAME','DB_NAME_NEW'
Go 
ALTER DATABASE DB_NAME_NEW  SET MULTI_USER -- set back to multi user 
GO