2009-09-17 20 views
9

Necesito realizar una restauración de la base de datos desde mi aplicación. Antes de hacer esto, quiero matar a todos los procesos de la siguiente manera:Eliminar todas las conexiones activas de la base de datos fallidas para el servidor al ejecutar KillAllProcesses

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

Sin embargo, cuando se ejecuta la primera KillAllProcesses, me sale el siguiente excepción:

Microsoft.SqlServer.Management.Smo.FailedOperationException : Eliminar todas las conexiones de bases de datos activas que fallaron para el servidor 'MYServer'. ---> Microsoft.SqlServer.Management.Common.ExecutionFailureException: se produjo una excepción al ejecutar una instrucción o lote de Transact-SQL. ---> System.Data.SqlClient.SqlException: solo se pueden eliminar los procesos de usuario.

La cadena de conexión utilizada para crear el servidor tiene sa credenciales, sin embargo, los procesos que necesitan ser terminados se inician bajo un usuario diferente. Probé el escenario similar y la prueba tuvo éxito.

Esto comenzó a suceder solo recientemente. Para mí, parece que hay algunos procesos en ejecución que el usuario no ha iniciado.

Respuesta

10

Parece que su código está intentando terminar todos los procesos de SQL Server, lo cual no es una buena idea.

Si desea realizar una restauración de la base de datos, debe establecer la base de datos en cuestión en modo single_user o RESTRICTED_USER, siendo la última la más adecuada.

Tome un vistazo a la following example de cambiar una base de datos a modo de RESTRICTED_USER y cómo cerrar cualquier abiertas usuario conexiones en el proceso.

How to: Set a Database to Single-User mode

-1

Puede utilizar SMO para "matar" una base de datos en particular. Esto forzará una caída de todas las conexiones del cliente a esa base de datos solamente y luego soltará la base de datos.

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

¡Y suelte la base de datos! Lo importante es saber ... – Guillaume86

Cuestiones relacionadas