2009-08-08 17 views
210

Sto utilizzando SQL Server 2008 Enterprise. Voglio vedere tutte le connessioni attive di SQL Server e le relative informazioni di tutte le connessioni, come da quale indirizzo IP, collegarmi a quale database o qualcosa del genere.Come vedo le connessioni attive di SQL Server?

Esistono strumenti esistenti per risolvere questo problema?

risposta

258

È possibile utilizzare la procedura memorizzata sp_who.

Fornisce informazioni su utenti, sessioni e processi correnti in un'istanza del Motore di database Microsoft SQL Server. Le informazioni possono essere filtrate per restituire solo quei processi che non sono inattivi, che appartengono a un utente specifico o che appartengono a una sessione specifica.

+5

quando si deve filtrare per specifica selezione db da sys.sysprocesses è meglio –

+0

come vorrei aggiungere un filtro solo per i database specifici? WHERE dbname = 'nome database' ?? Ho provato questo e ho ricevuto un errore –

+1

@ Geo.Dude, Iman Abidi significa creare la tua query di selezione da sys.sysprocesses e aggiungere una clausola where a quella query. Dovrai filtrare su dbid. Puoi trovare l'ID del database in sys.databases (o puoi unirli a questi due). – bvgheluwe

38

parte sp_who, è anche possibile utilizzare la stored procedure "non documentata" sistema sp_who2 che vi dà informazioni più dettagliate. Vedi Difference between sp_who and sp_who2.

+10

chi è connesso a dbo.First? –

+0

Non so. Terza forma normale! –

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

Vedere anche la documentazione Microsoft per sys.sysprocesses.

+1

Quando si automatizzano le cose, questa query potrebbe essere più utile di sp_who, che è più orientato alla visualizzazione. – Colin

+0

Grazie mille!Stavo cercando un'alternativa a sp_who, in quanto SELECT è più facile da gestire in una vista. –

+0

Quando si esegue questa istruzione, viene rivelato un numero elevato di connessioni aperte per il master db dall'utente sa. Perché è la ragione? –

29

Fare clic sull'icona "Activity Monitor" nella barra degli strumenti ...

Dai commenti di Thorsten:

In SQL Server Management Studio, fare clic destro sul server, scegliere "Activity Monitor" dal menu contestuale -oppure- utilizzare la scorciatoia da tastiera Ctrl + Alt + A.

+7

In SQL Server Management Studio, fare clic con il tasto destro del mouse su Server, selezionare "Monitoraggio attività" dal menu di contesto -oppure- utilizzare la scorciatoia da tastiera Ctrl + Alt + A –

+0

Buona opzione, ma richiede più privilegi di DB_NAME (dbid) estrazione da sys .sysprocesses. –

11

ho buttato questo insieme in modo che si potrebbe fare un po 'interrogazione sui risultati

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

Qui di seguito è il mio script per trovare tutte le sessioni collegate a un database e si può controllare se tali sessioni stanno facendo ogni I/O e c'è un'opzione per ucciderli.

Lo script mostra anche lo stato di ogni sessione.

Dai un'occhiata qui sotto.

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

--============================================================================== 
Problemi correlati