Retirar todas as conexões de banco de dados ativos falhou por servidor ao executar KillAllProcesses
-
10-07-2019 - |
Pergunta
Eu preciso executar uma restauração do banco de dados do meu aplicativo. Antes de fazer isso, eu quero matar todos os processos da seguinte forma:
private void KillAllProcessesOnSMARTDatabases(Server targetServer)
{
targetServer.KillAllProcesses(SMART_DB);
targetServer.KillAllProcesses(SMART_HISTORY_DB);
targetServer.KillAllProcesses(SMART_METADATA_DB);
SqlConnection.ClearAllPools();
}
No entanto, quando os primeiros KillAllProcesses é executado, eu recebo a seguinte exceção:
Microsoft.SqlServer.Management.Smo.FailedOperationException: Gota todas as conexões de banco de dados ativas falhou para o servidor 'MyServer'. ---> Microsoft.SqlServer.Management.Common.ExecutionFailureException: Ocorreu uma exceção ao executar uma instrução Transact-SQL ou lote. ---> System.Data.SqlClient.SqlException:. Apenas os processos do usuário podem ser mortos
A seqüência de conexão usada para criar o servidor tem sa credenciais, no entanto, os processos que precisam ser terminadas são iniciados sob um usuário diferente. Eu testei o cenário semelhante e o teste bem sucedido.
Isso começou a acontecer recentemente. Para mim parece que há alguns processos em execução que não são iniciados pelo usuário?
Solução
Parece que o código está a tentar terminar todos os processos do SQL Server, que não é uma boa idéia.
Se você quiser executar uma restauração do banco de dados, você deve definir o banco de dados em questão em qualquer Modo SINGLE_USER ou RESTRICTED_USER, o mais tarde, sendo o mais adequado.
Dê uma olhada na seguinte exemplo de mudar de um banco de dados para o modo RESTRICTED_USER e como para fechar qualquer user aberta ??strong> conexões no processo.
Outras dicas
Você pode usar o SMO para "matar" um banco de dados particular. Isto irá forçar uma queda de todas as ligações de cliente para essa base de dados única e, em seguida, largar o próprio banco de dados .
Microsoft.SqlServer.Management.Smo.Server oServer = this.GetSmoServer();
oServer.KillDatabase(this.DatabaseName);