Olá pessoal…
Hoje vou mostrar como encerrar todas as conexões em uma database no SQL Server.
Esse procedimento pessoal, basicamente pega os endereços do SQL Server e “mata” a conexão deles, sem precisar utilizar comandos como ALTER DATABASE.
Abaixo o código fonte completo:
--Se a procedure existir, exclui IF OBJECT_ID('dbo.sp_Kill', 'P') IS NOT NULL DROP PROCEDURE [dbo].[sp_Kill] GO --Cria a procedure e o parâmetro que ela recebe CREATE PROCEDURE sp_Kill @DBNAME VARCHAR(30) AS BEGIN SET NOCOUNT ON DECLARE @SPID INT DECLARE @STR NVARCHAR(50) DECLARE @HOSTNAME NVARCHAR(50) DECLARE @DBID INT --Cria a tabela tempor[ár] CREATE TABLE #TMPLOG ( SPID INT, ECID INT, STATUS VARCHAR(50), LOGINAME VARCHAR(255), HOSTNAME VARCHAR(50), BLK INT, DBNAME VARCHAR(30), CMD VARCHAR(100) , RID INT, ) --Se não encontrar a database, mostra log de erro SELECT @DBID = DB_ID(@DBNAME) IF @DBID IS NULL PRINT 'Nao foi encontrado a database [' + @DBNAME + '], verificar o nome.' --Inserir na tabela temporária, o próprio SPID para desconsiderar INSERT INTO #TMPLOG EXEC SP_WHO --Deleta tudo da TMPLOG que for abaixo de 50 (podem fazer parte de processos internos do SQL Server) DELETE FROM #TMPLOG WHERE SPID < 50 IF @@ERROR <> 0 GOTO ERROR_HANDLE --Declara o cursor para pegar os SPID dessa DataBase DECLARE CURPROCESSID CURSOR FOR SELECT SPID FROM #TMPLOG WHERE DBNAME LIKE @DBNAME OPEN CURPROCESSID --Seleciona o SPID para ver se é válido FETCH NEXT FROM CURPROCESSID INTO @SPID SELECT @HOSTNAME=HOSTNAME FROM #TMPLOG WHERE SPID=@SPID --Verifica se há SPID para ser encerrado IF @SPID IS NOT NULL PRINT 'Existem SPID para serem encerrado na database: ' + @DBNAME ELSE PRINT 'Nao existe SPID para serem encerrados na database ' + @DBNAME --Percorrendo os dados WHILE @@FETCH_STATUS = 0 BEGIN --Se for o mesmo SPID IF @SPID = @@SPID BEGIN PRINT 'O seu SPID nao pode ser encerrado, pulando ' + CONVERT(VARCHAR,@SPID) + ' - ' + @HOSTNAME END ELSE BEGIN --Executando o comando de Kill e imprimindo o SPID SET @STR = 'KILL ' + CONVERT(VARCHAR,@SPID) EXEC (@STR) PRINT CONVERT(VARCHAR,@SPID) + ' - ' + @HOSTNAME END --Se houve erro, pula para o ERROR_HANDLE IF @@ERROR <> 0 GOTO ERROR_HANDLE FETCH NEXT FROM CURPROCESSID INTO @SPID END --Declaração do Ponteiro de Erro para mostrar mensagem ERROR_HANDLE: IF @@ERROR <> 0 PRINT 'Erro ao encerrar o SPID - ' + CONVERT(VARCHAR,@SPID) + ' - ' + @HOSTNAME --Dropa tabela temporária DROP TABLE #TMPLOG SET NOCOUNT OFF END
Obs.: Antes de executar em produção, faça um teste em uma base de testes.
Referência: https://www.sqlservercentral.com/Forums/1315827/Kill-All-Spids-according-to-Database-Name
Bom pessoal, por hoje é só.
Abraços e até a próxima.