Ошибка сброса всех активных подключений к базе данных для Сервера при выполнении KillAllProcesses - PullRequest
9 голосов
/ 17 сентября 2009

Мне нужно восстановить базу данных из моего приложения. Прежде чем сделать это, я хочу убить все процессы следующим образом:

    private void KillAllProcessesOnSMARTDatabases(Server targetServer)
    {
        targetServer.KillAllProcesses(SMART_DB);
        targetServer.KillAllProcesses(SMART_HISTORY_DB);
        targetServer.KillAllProcesses(SMART_METADATA_DB);
        SqlConnection.ClearAllPools();
    }

Однако, когда запускается первый KillAllProcesses, я получаю следующее исключение:

Microsoft.SqlServer.Management.Smo.FailedOperationException: сбрасывать сбой всех активных соединений с базой данных для сервера «MYServer». ---> Microsoft.SqlServer.Management.Common.ExecutionFailureException: исключение произошло при выполнении оператора или пакета Transact-SQL. ---> System.Data.SqlClient.SqlException: могут быть уничтожены только пользовательские процессы.

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

Это начало происходить только недавно. Мне кажется, есть запущенные процессы, которые не запускаются пользователем?

Ответы [ 2 ]

10 голосов
/ 17 сентября 2009

Может показаться, что ваш код пытается завершить все процессы SQL Server, что не очень хорошая идея.

Если вы хотите выполнить восстановление базы данных, вы должны установить для рассматриваемой базы данных либо режим single_user, либо режим RESTRICTED_USER, последний из которых является наиболее подходящим.

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

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

0 голосов
/ 22 июля 2010

Вы можете использовать SMO, чтобы «убить» определенную базу данных. Это приведет к удалению всех клиентских подключений только к этой базе данных, а затем удалит саму базу данных .

Microsoft.SqlServer.Management.Smo.Server oServer = this.GetSmoServer();
oServer.KillDatabase(this.DatabaseName);
...