Retirar todas as conexões de banco de dados ativos falhou por servidor ao executar KillAllProcesses

StackOverflow https://stackoverflow.com/questions/1439183

  •  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?

Foi útil?

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 conexões no processo.

Como definir um banco de dados para o modo de usuário único

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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top