Respostas:
A razão pela qual a abordagem sugerida por Adam não funcionará é que, durante o tempo em que você estiver percorrendo as conexões ativas, uma nova poderá ser estabelecida, e você sentirá falta dela. Em vez disso, você pode usar a seguinte abordagem, que não tem essa desvantagem:
-- 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
Script para fazer isso, substitua 'DB_NAME' pelo banco de dados para eliminar todas as conexões com:
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
and spid <> @@SPID
à SELECT @sKillConnection
declaração para que não tentasse eliminar minha conexão atual, o que geraria uma mensagem de erro.
Mate-o e mate-o com fogo:
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
Usando o SQL Management Studio Express:
Na árvore do Pesquisador de objetos, vá para Gerenciamento em "Monitor de atividades" (se você não conseguir encontrá-lo, clique com o botão direito do mouse no servidor de banco de dados e selecione "Monitor de atividades"). Ao abrir o Activity Monitor, você pode visualizar todas as informações do processo. Você poderá encontrar os bloqueios do banco de dados de seu interesse e eliminar esses bloqueios, o que também matará a conexão.
Você poderá renomear depois disso.
ALTER DATABASE [Test]
SET OFFLINE WITH ROLLBACK IMMEDIATE
ALTER DATABASE [Test]
SET ONLINE
Ficar off-line leva um tempo e às vezes tenho alguns problemas com isso.
Maneira mais sólida na minha opinião:
Destacar Clique com o botão direito do mouse em DB -> Tarefas -> Desanexar ... marque "Drop Connections" Ok
Recoloque o botão direito do mouse em Bancos de dados -> Anexar .. Adicionar ... -> selecione seu banco de dados e altere a coluna Anexar como para o nome do banco de dados desejado. Está bem
Select 'Kill '+ CAST(p.spid AS VARCHAR)KillCommand into #temp
from master.dbo.sysprocesses p (nolock)
join master..sysdatabases d (nolock) on p.dbid = d.dbid
Where d.[name] = 'your db name'
Declare @query nvarchar(max)
--Select * from #temp
Select @query =STUFF((
select ' ' + KillCommand from #temp
FOR XML PATH('')),1,1,'')
Execute sp_executesql @query
Drop table #temp
use o banco de dados 'master' e execute esta consulta, ele matará todas as conexões ativas do seu banco de dados.
Normalmente, encontro esse erro quando estou tentando restaurar um banco de dados. Geralmente, apenas vou para o topo da árvore no Management Studio e clico com o botão direito do mouse e reinicio o servidor de banco de dados (porque está em uma máquina de desenvolvimento, isso pode não ser o ideal em produção ) Isso fecha todas as conexões com o banco de dados.
ALTER DATABASE ... SET SINGLE_USER
comandos em outras respostas retornaram o mesmo erro 'não foi possível obter o bloqueio exclusivo').
No MS SQL Server Management Studio, no explorador de objetos, clique com o botão direito do mouse no banco de dados. No menu de contexto a seguir, selecione 'Tarefas -> Desligar'
Outra abordagem "mate-o com fogo" é apenas reiniciar o serviço MSSQLSERVER. Eu gosto de fazer coisas na linha de comando. Colar isso exatamente no CMD fará com que: NET STOP MSSQLSERVER & NET START MSSQLSERVER
Ou abra "services.msc" e localize "SQL Server (MSSQLSERVER)" e clique com o botão direito do mouse, selecione "reiniciar".
Isso "com certeza, com certeza" mata TODAS as conexões com TODOS os bancos de dados em execução nessa instância.
(Gosto disso melhor do que muitas abordagens que alteram e alteram a configuração no servidor / banco de dados)
Veja como esse tipo de coisa é confiável no MS SQL Server Management Studio 2008 (pode funcionar para outras versões também):
A opção que trabalha para mim nesse cenário é a seguinte:
Tente o seguinte:
ALTER DATABASE [DATABASE_NAME]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE
Clique com o botão direito do mouse no nome do banco de dados, clique em Propriedades para obter a janela de propriedades, Abra a guia Opções e altere a propriedade "Restringir Acesso" de Multiusuário para Único Usuário. Quando você pressiona o botão OK, ele solicita que você feche todas as conexões abertas, selecione "Sim" e está pronto para renomear o banco de dados ....
Eles não funcionaram para mim (SQL2008 Enterprise), também não consegui ver nenhum processo em execução ou usuários conectados ao banco de dados. Reiniciar o servidor (clique com o botão direito do mouse em Sql Server no Management Studio e selecione Reiniciar) me permitiu restaurar o banco de dados.
Estou usando o SQL Server 2008 R2, meu banco de dados já estava definido para usuário único e havia uma conexão que restringia qualquer ação no banco de dados. Portanto, a solução recomendada do SQLMenace respondeu com erro. Aqui está um que funcionou no meu caso .
Eu uso sp_who para obter a lista de todos os processos no banco de dados. Isso é melhor porque você pode revisar qual processo matar.
declare @proc table(
SPID bigint,
Status nvarchar(255),
Login nvarchar(255),
HostName nvarchar(255),
BlkBy nvarchar(255),
DBName nvarchar(255),
Command nvarchar(MAX),
CPUTime bigint,
DiskIO bigint,
LastBatch nvarchar(255),
ProgramName nvarchar(255),
SPID2 bigint,
REQUESTID bigint
)
insert into @proc
exec sp_who2
select *, KillCommand = concat('kill ', SPID, ';')
from @proc
Resultado
Você pode usar o comando na coluna KillCommand para matar o processo que deseja.
SPID KillCommand
26 kill 26;
27 kill 27;
28 kill 28;
Você pode usar o comando SP_Who e eliminar todos os processos que usam seu banco de dados e renomeá-lo.