アクティブなSQL Server接続を確認するにはどうすればよいですか?


298

SQL Server 2008 Enterpriseを使用しています。アクティブなSQL Server接続と、どのIPアドレスから、どのデータベースに接続しているかなど、すべての接続の関連情報を表示したいのですが。

この問題を解決する既存のコマンドはありますか?



sys.dm_exec_sessions、チェックするセッションID> 50
Shiwangini '20

回答:


354

sp_whoストアドプロシージャを使用できます。

Microsoft SQL Serverデータベースエンジンのインスタンスの現在のユーザー、セッション、およびプロセスに関する情報を提供します。情報をフィルタリングして、アイドル状態ではないプロセス、特定のユーザーに属するプロセス、または特定のセッションに属するプロセスのみを返すことができます。


9
sys.sysprocessesから選択する特定のデータベースをフィルターする必要がある場合
Iman

特定のデータベースのみにフィルターを追加するにはどうすればよいですか?WHERE dbname = 'データベース名' ?? 私はこれを試してみましたが、私はエラーを得た
NULL.Dude

1
@ Geo.Dude、Iman Abidiは、sys.sysprocessesから独自の選択クエリを作成し、そのクエリにwhere句を追加することを意味します。dbidでフィルタリングする必要があります。データベースIDはsys.databasesで確認できます(または、これら2つを結合できます)。
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
;

sys.sysprocessesについては、Microsoftのドキュメントも参照してください。


5
物事を自動化するとき、このクエリは、表示を指向するsp_whoよりも役立つ場合があります。
コリン

これは私の好みの方法ですが、OPの質問に完全に答えるものではありません。and 句に追加hostnameしてSELECTGROUP BY接続されているクライアントを確認することをお勧めします。また、私はMsftのタイプミスに気づきましたloginame-それは、列名が8文字に制限されたときのアーティファクトですか?笑
何も必要ない

13
sys.sysprocessesは、SQL Serverの最近のバージョンでは廃止されています。これは、sys.dm_exec_connections、sys.dm_exec_sessions、およびsys.dm_exec_requestsの3つの管理ビューにマップします
マイクシェリル「キャットリコール」

私は好きですORDER BY 1, 2 DESC, 3
slartidan

56

とは別に、より詳細な情報を提供するsp_who「文書化されていない」sp_who2システムストアドプロシージャを使用することもできます。sp_whoとsp_who2の違いを参照してください。


16
dbo.Firstに接続しているのは誰ですか?
カールG

44

ツールバーの「アクティビティモニター」アイコンをクリックします...

トールステンのコメントから:

SQL Server Management Studioで、サーバーを右クリックし、コンテキストメニューから[アクティビティモニター]を選択します。または、キーボードショートカットCtrl+ Alt+を使用しますA


12
SQL Server Management Studioを、サーバー上の右クリックで、コンテキストメニュー-または-使用キーボードショートカットはCtrl + Alt + Aから「アクティビティモニタ」を選択してください
はThorstenHüglin

適切なオプションですが、sys.sysprocessesからのDB_NAME(dbid)抽出よりも多くの権限が必要です。
Der Zinger 2016年

25

以下は、データベースに接続されているすべてのセッションを見つけるためのスクリプトです。これらのセッションがI / Oを実行しているかどうかを確認でき、それらを強制終了するオプションがあります。

スクリプトには、各セッションのステータスも表示されます。

以下をご覧ください。

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

結果をいくつかクエリできるように、これを一緒に投げました

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は廃止されました
Marcello Miorelli、2018

5

KILLコマンドの使用を説明するMSのクエリは、接続の情報を提供するのに非常に役立ちます。

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

次のT-SQLコマンドを実行できます。

SELECT * FROM sys.dm_exec_sessions WHERE status = 'running';
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.