2009-09-17 12 views
9

È necessario eseguire un ripristino del database dalla mia applicazione. Prima di fare questo, voglio uccidere tutti i processi come segue:Rilascio di tutte le connessioni al database attive non riuscite per il server durante l'esecuzione di KillAllProcesses

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

Tuttavia, quando i primi KillAllProcesses viene eseguito, ottengo la seguente eccezione:

Microsoft.SqlServer.Management.Smo.FailedOperationException : Interruzione di tutte le connessioni al database attive non riuscite per il server 'MYServer'. ---> Microsoft.SqlServer.Management.Common.ExecutionFailureException: si è verificata un'eccezione durante l'esecuzione di un'istruzione Transact-SQL o di un batch. ---> System.Data.SqlClient.SqlException: solo i processi utente possono essere uccisi.

La stringa di connessione utilizzata per creare il server ha credenziali sa, tuttavia, i processi che devono essere terminati vengono avviati con un altro utente. Ho provato lo scenario simile e il test è riuscito.

Questo evento è iniziato solo di recente. A me sembra che ci siano dei processi in esecuzione che non sono stati avviati dall'utente?

risposta

10

Sembra che il codice stia tentando di terminare tutti i processi di SQL Server, il che non è una buona idea.

Se si desidera eseguire un ripristino del database, è necessario impostare il database in questione in modalità single_user o in modalità RESTRICTED_USER, più tardi sarà il più adatto.

Date un'occhiata al following example di commutazione di un database in modalità RESTRICTED_USER e come chiudere tutte aperte utente connessioni nel processo.

How to: Set a Database to Single-User mode

-1

È possibile utilizzare SMO per "uccidere" un particolare database. Questo imporrà solo una goccia di tutte le connessioni client a quel database e quindi rilascia il database stesso.

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

E rilascia il database! Cosa importante sapere ... – Guillaume86

Problemi correlati