Как я вижу активные соединения SQL Server? - PullRequest
255 голосов
/ 08 августа 2009

Я использую SQL Server 2008 Enterprise. Я хочу видеть любые активные подключения к SQL Server и связанную информацию о всех подключениях, например, с какого IP-адреса, к какой базе данных подключаться или к чему-либо.

Существуют ли команды для решения этой проблемы?

Ответы [ 7 ]

312 голосов
/ 08 августа 2009

Вы можете использовать хранимую процедуру sp_who.

Предоставляет информацию о текущих пользователях, сеансах и процессах в экземпляре ядра СУБД Microsoft SQL Server. Информацию можно отфильтровать, чтобы она возвращала только те процессы, которые не простаивают, принадлежат определенному пользователю или относятся к определенному сеансу.

299 голосов
/ 22 февраля 2012
SELECT 
    DB_NAME(dbid) as DBName, 
    COUNT(dbid) as NumberOfConnections,
    loginame as LoginName
FROM
    sys.sysprocesses
WHERE 
    dbid > 0
GROUP BY 
    dbid, loginame
;

См. Также документацию Microsoft для sys.sysprocesses .

47 голосов
/ 08 августа 2009

Помимо sp_who, вы также можете использовать «недокументированную» системную хранимую процедуру sp_who2, которая дает вам более подробную информацию.См. Разница между sp_who и sp_who2 .

38 голосов
/ 22 марта 2012

Нажмите значок «Монитор активности» на панели инструментов ...

Из комментариев Торстена:

В SQL Server Management Studio щелкните правой кнопкой мыши Сервер, выберите «Монитор активности» в контекстном меню или воспользуйтесь сочетанием клавиш Ctrl + Alt + A .

19 голосов
/ 18 июля 2017

Ниже приведен мой сценарий для поиска всех сеансов, подключенных к базе данных, и вы можете проверить, выполняют ли эти сеансы какие-либо операции ввода-вывода, и есть возможность их убить.

Скрипт также показывает состояние каждого сеанса.

Посмотрите ниже.

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

--==============================================================================
12 голосов
/ 22 августа 2012

Я скомбинировал это, чтобы вы могли поинтересоваться результатами

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
0 голосов
/ 20 мая 2019

Запрос MS, объясняющий использование команды " kill ", весьма полезен, предоставляя информацию о соединении:

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, привет,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...