«

»

nov 06

Matando processos no SQL

Em alguns procedimentos é necessário ter exclusividade na base como um restore, por exemplo. Aí você abre o Activity Monitor e se depara com dezenas ou centenas de conexões. Outras bases estão em produção portanto você não pode alterar portas ou isolar a nível de servidor. Como matar os processos de usuários somente da base que você precisa ter exclusividade?

 

O script abaixo mata os processos relacionados a base que você especifica e pode ser utilizado em uma procedure com um parâmetro para o nome da base:

 

declare @spid int
declare @db_name varchar(100)
set @db_name = ‘NomeDaBase’ — coloque o nome da base aqui

declare spid cursor for

select spid
from master.dbo.sysprocesses(nolock)
where dbid = db_id(@db_name) and spid > 50
union
select distinct request_session_id
from sys.dm_tran_locks (nolock)
where resource_database_id = db_id(@db_name) and request_session_id > 50
open spid

fetch next from spid into @spid

while @@fetch_status = 0
begin
exec (‘kill ‘ + @spid)
fetch next from spid into @spid
end

 

close spid
deallocate spid

 

 

Adicione ao final do script este pedacinho que já coloca a base em SINGLE USER e deixa você no contexto dela:

 

USE @db_name
GO
ALTER DATABASE @db_name SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO

 

Não se esqueça de, depois do seu procedimento, voltar a base para MULTI_USER:

 

ALTER DATABASE @db_name SET MULTI_USER
GO

 

 .

1 comentário

  1. Sandro Costa da Silva

    Parabéns pelo post, execelente exemplo e explicação.

    Abraços,

    Sandro

Deixe uma resposta