Como se mata todas as ligações actuais a uma base de dados SQL Server 2005?

Quero renomear uma base de dados, mas continuar a obter o erro que 'couldn't obter o bloqueio exclusivo' na base de dados, o que implica que há alguma(s) ligação(ões) ainda activa(s).

Como posso matar todas as ligações à base de dados para poder dar-lhe um novo nome?

Solução

Ver Matar todas as ligações activas a uma base de dados.

A razão pela qual a abordagem que Adam sugeriu ganhou't funciona é que durante o tempo em que estiver a fazer looping sobre as ligações activas é possível estabelecer novas ligações, e você'vai sentir falta delas. O artigo a que liguei utiliza a seguinte abordagem, que não tem 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
Comentários (6)

Script para conseguir isto, substituir 'DB_NAME' com a base de dados para matar todas as ligações:

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
Comentários (4)

No MS SQL Server Management Studio no explorador de objectos, clique com o botão direito do rato sobre a base de dados. No menu de contexto que se segue seleccione 'Tasks -> Take Offline'

Comentários (1)