Comment voir les connexions SQL Server actives?

298

J'utilise SQL Server 2008 Enterprise. Je veux voir toutes les connexions SQL Server actives et les informations connexes de toutes les connexions, comme depuis quelle adresse IP, se connecter à quelle base de données ou quelque chose.

Existe-t-il des commandes pour résoudre ce problème?

George2
la source
sys.dm_exec_sessions, identifiant de session à vérifier> 50
Shiwangini

Réponses:

354

Vous pouvez utiliser la sp_whoprocédure stockée.

Fournit des informations sur les utilisateurs, les sessions et les processus actuels dans une instance du moteur de base de données Microsoft SQL Server. Les informations peuvent être filtrées pour renvoyer uniquement les processus qui ne sont pas inactifs, qui appartiennent à un utilisateur spécifique ou qui appartiennent à une session spécifique.

Mehrdad Afshari
la source
9
quand vous devez filtrer pour une base de données spécifique, la sélection dans sys.sysprocesses est meilleure
Iman
comment ajouter un filtre pour des bases de données spécifiques uniquement? OERE dbname = 'nom de la base de données' ?? J'ai essayé ceci et j'ai eu une erreur
NULL.Dude
1
@ Geo.Dude, Iman Abidi signifie créer votre propre requête de sélection à partir de sys.sysprocesses et ajouter une clause where à cette requête. Vous devrez filtrer sur dbid. Vous pouvez trouver l'ID de la base de données dans sys.databases (ou vous pouvez joindre ces deux).
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
;

Voir également la documentation Microsoft pour sys.sysprocesses .

Syed Umar Ahmed
la source
5
Lors de l'automatisation des choses, cette requête peut être plus utile que sp_who qui est plus orienté vers l'affichage.
Colin
C'est ma méthode préférée, mais elle ne répond pas entièrement à la question du PO. Suggérez d'ajouter hostnameaux clauses SELECTet GROUP BYpour voir quels clients sont connectés. De plus, je viens de réaliser la faute de frappe de Msft loginame- est-ce un artefact à partir du moment où les noms de colonne étaient limités à 8 caractères? lol
rien n'est nécessaire
13
sys.sysprocesses est déconseillé dans les versions plus récentes de SQL Server. Il correspond à ces trois vues de gestion : sys.dm_exec_connections, sys.dm_exec_sessions et sys.dm_exec_requests.
Mike Sherrill 'Cat Recall'
J'aimeORDER BY 1, 2 DESC, 3
slartidan
56

En dehors de cela sp_who, vous pouvez également utiliser la sp_who2procédure stockée système "non documentée" qui vous donne des informations plus détaillées. Voir Différence entre sp_who et sp_who2 .

Sklivvz
la source
16
qui est connecté à dbo.First?
Carl G
44

Cliquez sur l'icône "moniteur d'activité" dans la barre d'outils ...

D'après les commentaires de Thorsten:

Dans SQL Server Management Studio, cliquez avec le bouton droit sur le serveur, choisissez «Moniteur d'activité» dans le menu contextuel - ou - utilisez le raccourci clavier Ctrl+ Alt+ A.

Fernando Santos
la source
12
Dans SQL Server Management Studio, cliquez avec le bouton droit sur le serveur, choisissez «Moniteur d'activité» dans le menu contextuel - ou - utilisez le raccourci clavier Ctrl + Alt + A
Thorsten Hüglin
Bonne option, mais elle nécessite plus de privilèges que l'extraction DB_NAME (dbid) à partir de sys.sysprocesses.
Der Zinger
25

Vous trouverez ci-dessous mon script pour trouver toutes les sessions connectées à une base de données et vous pouvez vérifier si ces sessions effectuent des E / S et il existe une option pour les tuer.

Le script affiche également l'état de chaque session.

Jetez un œil ci-dessous.

--==============================================================================
-- 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
la source
13

J'ai jeté cela ensemble pour que vous puissiez interroger les résultats

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
la source
sys.sysprocesses est déconseillé
Marcello Miorelli
5

La requête de MS expliquant l'utilisation de la KILLcommande est très utile pour fournir les informations de connexion:

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
la source
4

Vous pouvez exécuter la commande T-SQL suivante:

SELECT * FROM sys.dm_exec_sessions WHERE status = 'running';
Sinkmanu
la source