Зачем надо убивать активные соединения, к тому же ещё и все? Думаю, каждый второй это спросит. Я тоже бы спросил, если бы мне данная возможность не понадобилась однажды. Сейчас расскажу зачем. Использую в своей деятельности две базы данных: одна - реальная, а другая - тестовая...

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

Для того, чтобы попробовать что-то условно скажем "опасное" (новые режимы; режимы, которые применяются пользователем в его практике впервые; режимы, в результатах которых пользователь не уверен или не может спрогнозировать заранее и т.п.), существует тестовая база данных. Необходимо, чтобы эта тестовая база данных восстанавливалась с копии каждый день.

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

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

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

set nocount on
declare @databasename varchar(100)
declare @query varchar(max)
set @query = ''

set @databasename = 'xxx'
if db_id(@databasename) < 4
begin
print 'system database connection cannot be killeed'
return
end

select @query=coalesce(@query,',' )+'kill '+convert(varchar, spid)+ '; '
from master..sysprocesses where dbid=db_id(@databasename)

if len(@query) > 0
begin
print @query
exec(@query)
end

Скриншот окна выполнения запроса SQL Server

Особенность скрипта в том, что он убивает все соединения, кроме системных. Для запуска скрипта необходимо и достаточно указать в строке set @databasename = 'xxx' вместо XXX имя базы данных, соединения с которой нужно убить. На русунке выше видно, как я пытаюсь убить активные соединения с базой данных master, на что мне сообщается о невозможности завершения соединения с системной базой данных. На этом все. Удачи.

Добавить комментарий


Защитный код
Обновить