Sto usando SQL Server 2008 Enterprise. Voglio vedere tutte le connessioni attive di SQL Server e le informazioni correlate di tutte le connessioni, come da quale indirizzo IP, collegarmi a quale database o qualcosa del genere.
Esistono comandi esistenti per risolvere questo problema?
È possibile utilizzare la procedura sp_who
stored.
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.
SELECT
DB_NAME(dbid) as DBName,
COUNT(dbid) as NumberOfConnections,
loginame as LoginName
FROM
sys.sysprocesses
WHERE
dbid > 0
GROUP BY
dbid, loginame
;
Vedi anche la documentazione di Microsoft per sys.sysprocesses .
Oltre a sp_who
, puoi anche utilizzare la procedura memorizzata del sistema sp_who2
"non documentata" che ti fornisce informazioni più dettagliate. VediDifferenza tra sp_who e sp_who2.
Fai clic sull'icona "monitor attività" nella barra degli strumenti ...
Dai commenti di Thorsten:
In SQL Server Management Studio, fare clic con il pulsante destro del mouse su Server, selezionare "Monitoraggio attività" dal menu di scelta rapida oppure utilizzare la scorciatoia da tastiera Ctrl + Alt + A.
Di seguito è riportato il mio script per trovare tutte le sessioni connesse a un database e puoi verificare se tali sessioni stanno eseguendo qualsiasi I/O e c'è un'opzione per eliminarle.
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
--==============================================================================
L'ho buttato insieme in modo da poter fare qualche 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
La query di MS che spiega l'uso del comando " kill " è molto utile per fornire le informazioni di connessione:
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;
HTH, saluti,