2009-08-08 28 views
210

Estoy usando SQL Server 2008 Enterprise. Quiero ver cualquier conexión activa 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.¿Cómo veo las conexiones de SQL Server activas?

¿Existen herramientas existentes para resolver este problema?

Respuesta

258

Puede usar el procedimiento almacenado sp_who.

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

+5

cuando se tiene que filtro para seleccionar db específica de sys.sysprocesses es mejor –

+0

cómo iba a añadir un filtro para sólo bases de datos específicas? ¿DÓNDE dbname = 'nombre de la base de datos'? Intenté esto y obtuve un error –

+1

@ Geo.Dude, Iman Abidi significa crear su propia consulta de selección de sys.sysprocesses y agregar una cláusula where a esa consulta. Tendrás que filtrar en dbid. Puede encontrar el ID de la base de datos en sys.databases (o puede unir esos dos). – bvgheluwe

38

Aparte de sp_who, también se puede utilizar el procedimiento de "sin papeles" sp_who2 almacenado del sistema que le da una información más detallada. Ver Difference between sp_who and sp_who2.

+10

que está conectado a dbo.First? –

+0

No lo sé. ¡Tercera forma normal! –

248
SELECT 
    DB_NAME(dbid) as DBName, 
    COUNT(dbid) as NumberOfConnections, 
    loginame as LoginName 
FROM 
    sys.sysprocesses 
WHERE 
    dbid > 0 
GROUP BY 
    dbid, loginame 
; 

Véase también la documentación de Microsoft para sys.sysprocesses.

+1

Al automatizar cosas, esta consulta podría ser más útil que sp_who, que está más orientado a la visualización. – Colin

+0

¡Muchas gracias!Estaba buscando una alternativa a sp_who, ya que un SELECT es más fácil de manejar en una vista. –

+0

Cuando ejecuto esta declaración, revela una gran cantidad de conexiones abiertas para dominar db desde el usuario sa. ¿Por qué es la razón? –

29

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

De los comentarios de Thorsten:

En SQL Server Management Studio, haga clic derecho en el servidor, seleccione "Monitor de Actividad" del menú contextual -o bien - use el atajo de teclado Ctrl + Alt + A.

+7

En SQL Server Management Studio, haga clic con el botón secundario en Servidor, seleccione "Monitor de actividad" en el menú contextual -o-- use el atajo de teclado Ctrl + Alt + A –

+0

Buena opción, pero requiere más privilegios que la extracción DB_NAME (dbid) de sys .sysprocesses. –

11

me tiró juntos para que usted podría 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 
6

A continuación es mi guión para encontrar todas las sesiones conectadas a una base de datos y se puede comprobar si las sesiones están haciendo cualquier E/O y hay una opción para matarlos.

La secuencia de comandos muestra también el estado de cada sesión.

A continuación, le presentamos un vistazo.

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

--============================================================================== 
Cuestiones relacionadas