¿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?



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.


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 .


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


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.


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

--==============================================================================

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

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;

4

Puede realizar el siguiente comando T-SQL:

SELECT * FROM sys.dm_exec_sessions WHERE status = 'running';
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.