¿Cómo veo conexiones activas de SQL Server?

298

Estoy usando SQL Server 2008 Enterprise. Quiero ver las conexiones activas de SQL Server y la información relacionada de todas las conexiones, como desde qué dirección IP, conectarse a qué base de datos o algo así.

¿Hay comandos existentes para resolver este problema?

George2
fuente
sys.dm_exec_sessions, ID de sesión para verificar> 50
Shiwangini

Respuestas:

354

Puede usar el sp_whoprocedimiento almacenado.

Proporciona información sobre usuarios, sesiones y procesos actuales en una instancia del Motor de base de datos de Microsoft SQL Server. La información se puede filtrar para devolver solo aquellos procesos que no están inactivos, que pertenecen a un usuario específico o que pertenecen a una sesión específica.

Mehrdad Afshari
fuente
99
cuando tiene que filtrar para la selección de db específica de sys.sysprocesses es mejor
Iman
¿Cómo agregaría un filtro solo para bases de datos específicas? WHERE dbname = 'nombre de la base de datos' ?? Intenté esto y recibí un error
NULL.Dude
1
@ Geo.Dude, Iman Abidi significa crear su propia consulta de selección de los procesos sys.sys y agregar una cláusula where a esa consulta. Tendrás que filtrar en dbid. Puede encontrar la identificación de la base de datos en sys.databases (o puede unirse a esos dos).
bvgheluwe
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 también la documentación de Microsoft para sys.sysprocesses .

Syed Umar Ahmed
fuente
55
Al automatizar cosas, esta consulta puede ser más útil que sp_who, que está más orientada a la visualización.
Colin
Este es mi método preferido, pero no responde completamente la pregunta del OP. Sugiera agregar hostnamea las cláusulas SELECTy GROUP BYpara ver qué clientes están conectados. También me acabo de dar cuenta del error tipográfico de Msft loginame: ¿es un artefacto de cuando los nombres de las columnas se limitaban a 8 caracteres? jajaja
nada es necesario
13
sys.sysprocesses está en desuso en versiones más recientes de SQL Server. Se asigna a estas tres vistas de administración : sys.dm_exec_connections, sys.dm_exec_sessions y sys.dm_exec_requests.
Mike Sherrill 'Cat Recall'
Me gustaORDER BY 1, 2 DESC, 3
slartidan
56

Además sp_who, también puede utilizar el sp_who2procedimiento almacenado del sistema "indocumentado" que le brinda información más detallada. Vea la diferencia entre sp_who y sp_who2 .

Sklivvz
fuente
16
¿Quién está conectado a dbo.Primero?
Carl G
44

Haga clic en el icono "monitor de actividad" en la barra de herramientas ...

De los comentarios de Thorsten:

En SQL Server Management Studio, haga clic con el botón derecho en Servidor, elija "Monitor de actividad" en el menú contextual o utilice el método abreviado de teclado Ctrl+ Alt+ A.

Fernando Santos
fuente
12
En SQL Server Management Studio, haga clic con el botón derecho en Servidor, elija "Monitor de actividad" en el menú contextual o utilice el método abreviado de teclado Ctrl + Alt + A
Thorsten Hüglin
Buena opción, pero requiere más privilegios que la extracción DB_NAME (dbid) de los procesos sys.sys.
Der Zinger el
25

A continuación se muestra mi script para encontrar todas las sesiones conectadas a una base de datos y puede verificar si esas sesiones están haciendo alguna E / S y hay una opción para eliminarlas.

El script también muestra el estado de cada sesión.

Echa un vistazo a continuación.

--==============================================================================
-- 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
fuente
13

Puse esto en orden para que pudieras hacer algunas consultas sobre los 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
fuente
sys.sysprocesses está en desuso
Marcello Miorelli
5

La consulta de MS que explica el uso del KILLcomando es bastante útil al proporcionar información de la conexión:

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
fuente
4

Puede realizar el siguiente comando T-SQL:

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