Создаём запрос на языке SQL, чтобы узнать информацию об активных подключениях к MSSQL серверу

30 августа 2013

Очень часто возникает необходимость определить активные подключения к базе данных. Требуется видеть имя пользователя, имя рабочей станции, время подключения, кол-во подключений к той или иной базе данных в текущий момент времени. Как с помощью запроса SQL определить различные параметры активных подключений?

Если Вы используете в своей работе версию сервера SQL Server 2000, то запрос может выглядеть так:
SELECT db_name(dbid) as 'Имя БД',
       count(dbid) as 'Кол-во подключений',
       loginame as 'Имя входа SQL Server',
       hostname AS 'Имя рабочей станции'
FROM sys.sysprocesses
WHERE dbid > 0
GROUP BY dbid, loginame, hostname 

Данный запрос будет успешно выполняться и на SQL Server версии 2005 - 2012. В запросе sys.sysprocesses - системная таблица SQL Server 2000. Если Вы используете SQL Server 2005 или старше, то рекомендуется использовать системные представления SQL Server. Ниже приведен пример запроса, в котором используется системное представление sys.dm_exec_sessions реализованное в SQL Server 2008 R2.

SELECT db_name(session_id) AS 'Имя БД',
       login_name AS 'Имя входа SQL Server',
       host_name AS 'Имя рабочей станции',
	   login_time AS 'Время подключения сеанса',
	   COUNT(session_id) AS 'Кол-во подключений',
	   last_request_end_time AS 'Время завершения последнего запроса'
FROM sys.dm_exec_sessions
GROUP BY session_id, login_name, host_name, login_time, last_request_end_time

В функцию db_name(session_id) в качестве параметра передается не идентификатор базы данных, а идентификатор сеанса, связанный со всеми активными первичными соединениями. Что приятно, функция возвращает имя базы данных, которая связана с подключением. В SQL Server 2012 в представлении sys.dm_exec_sessions добавлено новое поле database_id - идентификатор текущей базы данных для каждого сеанса.

Представленный алгоритм написания запросов можно использовать при определении активных подключений к серверу в системе TDMS.