Como vejo as conexões ativas do SQL Server?

298

Estou usando o SQL Server 2008 Enterprise. Quero ver as conexões ativas do SQL Server e as informações relacionadas de todas as conexões, como de qual endereço IP, conectar a qual banco de dados ou algo assim.

Existem comandos existentes para resolver esse problema?

George2
fonte
sys.dm_exec_sessions, ID da sessão para verificar> 50
Shiwangini 20/20

Respostas:

354

Você pode usar o sp_whoprocedimento armazenado.

Fornece informações sobre usuários, sessões e processos atuais em uma instância do Microsoft SQL Server Database Engine. As informações podem ser filtradas para retornar apenas os processos que não estão ociosos, pertencem a um usuário específico ou pertencem a uma sessão específica.

Mehrdad Afshari
fonte
9
quando você tem que filtro para selecionar db específico sys.sysprocesses é melhor
Iman
como eu adicionaria um filtro apenas para bancos de dados específicos? ONDE dbname = 'nome do banco de dados' ?? Eu tentei isso e recebi um erro
NULL.Dude
1
@ Geo.Dude, Iman Abidi significa criar sua própria consulta de seleção a partir de sys.sysprocesses e adicionar uma cláusula where a essa consulta. Você terá que filtrar no dbid. Você pode encontrar o ID do banco de dados em sys.databases (ou pode ingressar nesses dois).
precisa saber é o seguinte
342
SELECT 
    DB_NAME(dbid) as DBName, 
    COUNT(dbid) as NumberOfConnections,
    loginame as LoginName
FROM
    sys.sysprocesses
WHERE 
    dbid > 0
GROUP BY 
    dbid, loginame
;

Consulte também a documentação da Microsoft para sys.sysprocesses .

Syed Umar Ahmed
fonte
5
Ao automatizar as coisas, essa consulta pode ser mais útil do que sp_who, que é mais orientado para a exibição.
Colin
Esse é o meu método preferido, mas não responde totalmente à pergunta do OP. Sugira adicionar hostnameàs cláusulas SELECTe GROUP BYpara ver quais clientes estão conectados. Também acabei de perceber o erro de digitação Msft para loginame- isso é um artefato de quando os nomes das colunas eram limitados a 8 caracteres? lol
nothingisnecessary
13
O sys.sysprocesses foi preterido nas versões mais recentes do SQL Server. Ele é mapeado para essas três visualizações de gerenciamento : sys.dm_exec_connections, sys.dm_exec_sessions e sys.dm_exec_requests.
Mike Sherrill 'Cat Recall'
Eu gosto deORDER BY 1, 2 DESC, 3
slartidan 10/07/19
56

Além disso sp_who, você também pode usar o sp_who2procedimento armazenado do sistema "não documentado" , que fornece informações mais detalhadas. Consulte Diferença entre sp_who e sp_who2 .

Sklivvz
fonte
16
quem está conectado ao dbo.First?
Carl G
44

Clique no ícone "monitor de atividade" na barra de ferramentas ...

Dos comentários de Thorsten:

No SQL Server Management Studio, clique com o botão direito do mouse em Server, escolha "Activity Monitor" no menu de contexto - ou - use o atalho do teclado Ctrl+ Alt+ A.

Fernando Santos
fonte
12
No SQL Server Management Studio, clique direito sobre Server, escolha "Activity Monitor" no menu de contexto -ou- atalho uso do teclado Ctrl + Alt + A
Thorsten Huglin
Boa opção, mas requer mais privilégios do que a extração DB_NAME (dbid) do sys.sysprocesses.
Zinger
25

Abaixo está o meu script para encontrar todas as sessões conectadas a um banco de dados e você pode verificar se essas sessões estão realizando alguma E / S e se há uma opção para eliminá-las.

O script mostra também o status de cada sessão.

Dê uma olhada abaixo.

--==============================================================================
-- See who is connected to the database.
-- Analyse what each spid is doing, reads and writes.
-- If safe you can copy and paste the killcommand - last column.
-- Marcelo Miorelli
-- 18-july-2017 - London (UK)
-- Tested on SQL Server 2016.
--==============================================================================
USE master
go
SELECT
     sdes.session_id
    ,sdes.login_time
    ,sdes.last_request_start_time
    ,sdes.last_request_end_time
    ,sdes.is_user_process
    ,sdes.host_name
    ,sdes.program_name
    ,sdes.login_name
    ,sdes.status

    ,sdec.num_reads
    ,sdec.num_writes
    ,sdec.last_read
    ,sdec.last_write
    ,sdes.reads
    ,sdes.logical_reads
    ,sdes.writes

    ,sdest.DatabaseName
    ,sdest.ObjName
    ,sdes.client_interface_name
    ,sdes.nt_domain
    ,sdes.nt_user_name
    ,sdec.client_net_address
    ,sdec.local_net_address
    ,sdest.Query
    ,KillCommand  = 'Kill '+ CAST(sdes.session_id  AS VARCHAR)
FROM sys.dm_exec_sessions AS sdes

INNER JOIN sys.dm_exec_connections AS sdec
        ON sdec.session_id = sdes.session_id

CROSS APPLY (

    SELECT DB_NAME(dbid) AS DatabaseName
        ,OBJECT_NAME(objectid) AS ObjName
        ,COALESCE((
            SELECT TEXT AS [processing-instruction(definition)]
            FROM sys.dm_exec_sql_text(sdec.most_recent_sql_handle)
            FOR XML PATH('')
                ,TYPE
            ), '') AS Query

    FROM sys.dm_exec_sql_text(sdec.most_recent_sql_handle)

) sdest
WHERE sdes.session_id <> @@SPID
  AND sdest.DatabaseName ='yourdatabasename'
--ORDER BY sdes.last_request_start_time DESC

--==============================================================================
Marcello Miorelli
fonte
13

Joguei isso juntos para que você pudesse fazer uma consulta sobre os resultados

Declare @dbName varchar(150)
set @dbName = '[YOURDATABASENAME]'

--Total machine connections
--SELECT  COUNT(dbid) as TotalConnections FROM sys.sysprocesses WHERE dbid > 0

--Available connections
DECLARE @SPWHO1 TABLE (DBName VARCHAR(1000) NULL, NoOfAvailableConnections VARCHAR(1000) NULL, LoginName VARCHAR(1000) NULL)
INSERT INTO @SPWHO1 
    SELECT db_name(dbid), count(dbid), loginame FROM sys.sysprocesses WHERE dbid > 0 GROUP BY dbid, loginame
SELECT * FROM @SPWHO1 WHERE DBName = @dbName

--Running connections
DECLARE @SPWHO2 TABLE (SPID VARCHAR(1000), [Status] VARCHAR(1000) NULL, [Login] VARCHAR(1000) NULL, HostName VARCHAR(1000) NULL, BlkBy VARCHAR(1000) NULL, DBName VARCHAR(1000) NULL, Command VARCHAR(1000) NULL, CPUTime VARCHAR(1000) NULL, DiskIO VARCHAR(1000) NULL, LastBatch VARCHAR(1000) NULL, ProgramName VARCHAR(1000) NULL, SPID2 VARCHAR(1000) NULL, Request VARCHAR(1000) NULL)
INSERT INTO @SPWHO2 
    EXEC sp_who2 'Active'
SELECT * FROM @SPWHO2 WHERE DBName = @dbName
Don Rolling
fonte
sys.sysprocesses está obsoleto
Marcello Miorelli
5

A consulta da Microsoft que explica o uso do KILLcomando é bastante útil, fornecendo informações da conexão:

SELECT conn.session_id, host_name, program_name,
    nt_domain, login_name, connect_time, last_request_end_time 
FROM sys.dm_exec_sessions AS sess
JOIN sys.dm_exec_connections AS conn
   ON sess.session_id = conn.session_id;
Zalakain
fonte
4

Você pode executar o seguinte comando T-SQL:

SELECT * FROM sys.dm_exec_sessions WHERE status = 'running';
sinkmanu
fonte