Как узнать активные сеансы пользователей в MS Sql 2008

Иногда бывает необходимо узнать, кто именно сейчас работает в базе данных или в базах данных на сервере MSSql 2008. Например, для того чтобы принудительно завершить все эти сеансы или просто узнать, кто именно нагружает сервер запросами. Сегодня мы научимся с Вами это делать, используя при этом простые запросы к системным представлениям на Transact-SQL.

Как Вы уже поняли, сегодня речь пойдет об активных сеансах и процессах в СУБД MSSql 2008, которые мы будем получать, используя системное представление sys.sysprocesses. Мы уже с Вами затрагивали некоторые системные вьюхи в статье Журналирование изменений данных в таблице на Transact-SQL, а именно sys.columns, которую мы использовали, для того чтобы узнать какие и сколько полей содержит та или иная таблица в базе.

Для того чтобы понимать, что такое системное представление, советую Вам для начала ознакомиться с понятием простого представления, которое рассматривается в статье — Зачем нужны представления (views) в базах данных. Также мы будем писать пусть простые, но все запросы, с основами которых Вы естественно должны быть знакомы, если нет, то можете прочитать статью основы языка SQL — оператор select.

Вроде бы все, что необходимо знать, перед тем как что-то пробовать из ниже приведенных примеров на практике я указал, переходим непосредственно к самой сути сегодняшнего вопроса.

Как узнать активные сеансы пользователей

Системное представление sys.sysprocesses содержит текущее состояние сервера на предмет запущенных процессов, исходя из этого, напишем простенький запрос:

select db_name(dbid) as db, spid as idproc, loginame, program_name, status
from   sys.sysprocesses

где,

  • db – это база данных, в которой запущен процесс;
  • idproc – идентификатор процесса;
  • loginame – логин, т.е. кто именно запустил;
  • program_name – приложение, из которого запущен процесс;
  • status – соответственно статус.

Статусы бывают разные, например,

  • Runnable – активный процесс, т.е. например, в данный момент выполняется какой-нибудь запрос;
  • Sleeping – режим ожидания, т.е. например, окно запроса открыто, но в данный момент он не запущен;
  • Background – запущен в фоновом режиме.

Если необходимо узнать, кто именно работает конкретно в той или иной базе можно добавить условие:

select db_name(dbid) as db, spid as idproc, loginame, program_name, status
from  sys.sysprocesses
where db_name(dbid) = 'name_db'

Соответственно вместо name_db пишите свою нужную базу данных, и результат будет получен только по этой базе данных.

Как завершить все активные сеансы пользователей

Это необходимо, например, для того чтобы получить монопольный доступ к базе данных, а для чего он Вам может понадобится это уже Ваше дело, например, чтобы восстановить базу данных. Мы кстати рассматривали процесс восстановления базы данных, правда, на MSSql 2000.

Для того чтобы завершить все подключения пользователей к бд, выполним следующий запрос:

set nocount on
declare @dbname varchar(100)
declare @query varchar(max)
set @query = ''
set @dbname = 'name_db'
select @query=coalesce(@query,',' )+'kill '+convert(varchar, spid)+ '; '
from sys.sysprocesses where dbid=db_id(@dbname)
if len(@query) > 0
begin
  exec(@query)
end

где,

  • @dbname – переменная, для того чтобы указать к какой базе необходимо завершить все подключения;
  • @query – переменная для хранения запроса;

В конструкции select мы динамически формируем запрос с идентификаторами процессов, которые необходимо завершить. Далее в переменной @query будет храниться запросы вида

kill 58; kill 61; kill 70;

которые мы выполним через exec(@query) и тем самым завершим все процессы.

Из всего выше сказанного Вы легко можете узнавать, кто именно сейчас выполняет запрос и даже завершить его, что в свою очередь иногда бывает полезно.

Также хотелось бы сказать, что в MSSql 2008 существует встроенный «Монитор активности». Его можно вызвать, нажав правой кнопкой по серверу, в окне «обозреватель объектов» и вызвать окно «Монитор активности», на котором будет располагаться список свойств, которые Вы можете развернуть для подробного просмотра, где в свою очередь и будет отображать вся текущая активность на сервере.

На сегодня это все, в дальнейших статьях мы продолжим изучение Transact-SQL и всего сервера MSSql 2008.

Понравилась статья? Поделиться с друзьями:
Заметки IT специалиста
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:
Нажимая на кнопку «Отправить комментарий», я даю согласие на обработку персональных данных и принимаю политику конфиденциальности.