¿Cómo ejecuto la copia de seguridad de la base de datos y restauro los scripts desde mi aplicación winform?

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

Pregunta

Estoy desarrollando una aplicación para pequeñas empresas que utiliza la base de datos Sqlserver 2005.

Plataforma: .Net framework 3.5; Tipo de aplicación: aplicación de Windows; Lenguaje: C #

Pregunta:

Necesito tomar y restaurar la copia de seguridad de mi aplicación. Tengo el script requerido generado desde SSME.

¿Cómo ejecuto ese script (o scripts) en particular desde mi aplicación winform?

¿Fue útil?

Solución

Puede ejecutar estos scripts de la misma manera que ejecuta una consulta, solo que no se conecta a la base de datos que desea restaurar, sino que se conecta al maestro.

Otros consejos

Si la máquina donde se ejecuta su aplicación tiene instaladas las herramientas de cliente de SQL Server, puede usar sqlcmd .

Si desea hacerlo programáticamente, puede usar SMO

Tutorial

Simplemente use su conexión a la base de datos (¿supongo que ADO?) y envíe sus instrucciones TSQL simples al servidor a través de esta conexión.

Para la copia de seguridad, probablemente quiera usar xp_sqlmaint. Tiene la capacidad práctica de eliminar copias de seguridad antiguas y crea un buen archivo de registro. Puedes llamarlo a través de algo como: EJECUTAR master.dbo.xp_sqlmaint N '' - S & Quot; [ServerName] & Quot; [ServerLogonDetails] -D [DatabaseName] -Rpt & Quot; [BackupArchive] \ BackupLog.txt & Quot; [RptExpirationSchedule] -CkDB -BkUpDB & Quot; [BackupArchive] & Quot; -BkUpMedia DISK [BakExpirationSchedule] ''

(reemplace los [corchetes] con valores adecuados).

También para la copia de seguridad puede que necesite hacer una copia de seguridad del registro de transacciones. Algo como: IF DATABASEPROPERTYEX ((SELECT db_name (dbid) FROM master..sysprocesses WHERE spid = @@ SPID), '' Recovery '') & Lt; & Gt; '' SIMPLE '' EJECUTAR master.dbo.xp_sqlmaint N '' -S & Quot; [ServerName] & Quot; [ServerLogonDetails] -D [DatabaseName] -Rpt & Quot; [BackupArchive] \ BackupLog_TRN.txt & Quot; [RptExpirationSchedule] -BkUpLog & Quot; [BackupArchive] & Quot; -BkExt TRN -BkUpMedia DISK [BakExpirationSchedule] ''

Recomiendo almacenar los comandos reales que está utilizando en una tabla de base de datos (1 fila por comando) y usar algún tipo de esquema de reemplazo de plantilla para manejar los valores configurables. Esto permitiría cambios fáciles en los comandos, sin necesidad de implementar un nuevo código.

Para la restauración, deberá eliminar todas las conexiones, excepto las del servidor SQL interno. Básicamente tome los resultados de & Quot; exec sp_who & Quot; y para las filas que coinciden en dbname, y tienen un estado que no es " background " ;, y un cmd que no es uno de " SIGNAL HANDLER " ;, quot; LOCK MONITOR " ;, " LAZY WRITER " ;, " LOG WRITER " ;, " CHECKPOINT SLEEP " hacer un " kill " en el spid (por ejemplo: ExecuteNonQuery (" kill 1283 ")).

Querrá atrapar e ignorar cualquier excepción del comando KILL. No hay nada que puedas hacer al respecto. Si la restauración no puede continuar debido a las conexiones existentes, generará un error.

Un peligro con la eliminación de conexiones es el grupo de conexiones de ADO (más para aplicaciones asp.net que aplicaciones de Windows). ADO asume que una conexión obtenida del grupo de conexiones es válida ... y no reacciona bien a las conexiones que se han cortado. La próxima operación que ocurra en esa conexión fallará. No puedo recordar el error ... es posible que pueda atrapar solo ese error específico y manejarlo ... también con 3.5 Creo que puede eliminar el grupo de conexiones (así que ... atrapar el error, eliminar el grupo de conexiones , abra la conexión, intente el comando nuevamente ... feo pero podría ser factible).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top