anunciad

domingo, 10 de fevereiro de 2013

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

fonte: http://sqldicas.com.br

Nenhum comentário:

Postar um comentário