2008-09-15 12 views
6

Estoy escribiendo una aplicación C# que descarga una copia de seguridad de la base de datos comprimida a través de FTP. La aplicación necesita extraer la copia de seguridad y restaurarla a la ubicación de base de datos predeterminada.C# SQL Restaure la base de datos a la ubicación de datos predeterminada

No sabré qué versión de SQL Server se instalará en la máquina donde se ejecuta la aplicación. Por lo tanto, necesito encontrar la ubicación predeterminada en función del nombre de la instancia (que está en el archivo de configuración).

Los ejemplos que encontré tenían una clave de registro que leyeron, pero esto no funcionará, ya que esto supone que solo se instaló una instancia de SQL.

Otro ejemplo que encontré creó una base de datos, leyó las propiedades del archivo de la base de datos, eliminó la base de datos una vez que se hizo. Eso es engorroso.

he encontrado algo en el marco .NET que debe trabajar, es decir:

Microsoft.SqlServer.Management.Smo.Server(ServerName).Settings.DefaultFile

El problema es que este está volviendo cadenas vacías, lo que no ayuda.

También necesito encontrar la cuenta NT bajo la cual se está ejecutando el servicio SQL, de modo que pueda otorgar acceso de lectura a ese usuario en el archivo de respaldo una vez que lo haya extraído.

Respuesta

7

Lo que descubrí es que

Microsoft.SqlServer.Management.Smo.Server(ServerName).Settings.DefaultFile 

sólo se devuelve un valor no nulo cuando no hay un camino definido de forma explícita. Tan pronto como especifique una ruta que no es la predeterminada, esta función devuelve esa ruta correctamente.

Entonces, una solución simple fue comprobar si esta función devuelve una cadena, o nulo. Si se devuelve una cadena, a continuación, utilizar eso, pero si es nulo, utilice

Microsoft.SqlServer.Management.Smo.Server(ServerName).Information.RootDirectory + "\\DATA\\" 
+0

Supongo que funcionó para usted. He intentado este mismo comando pero no funciona. Lanzo una excepción sobre "No se puede conectar a MYCOMPUTERNAME". No creo que sea un problema de firewall. Tal vez el alcance del permiso? ServerName es una cadena, ¿correcto? Sería mejor (nuevo Microsoft.SqlServer.Management.Smo.Server (yourServerName)). Information.RootDirectory? –

+0

¡Brillante! Estuve cavando para esto por unos días. – StarPilot

1

Una opción, que puede ser una solución más simple, es crear una nueva base de datos en su servidor de destino y luego RESTAURAR sobre esa base de datos con su copia de seguridad. Su copia de seguridad estará en el lugar correcto y no tendrá que preocuparse por "MOVER" el archivo de copia de seguridad cuando lo restaure. SQL espera que las copias de seguridad se restauren exactamente en la misma ruta física desde la que se realizó la copia de seguridad. Si ese no es el caso, debe usar la opción MOVER durante RESTAURAR. Esta solución también hace que sea más fácil cambiar el nombre de la base de datos en el proceso si, por ejemplo, desea agregar una fecha al nombre.

+0

Esta es una buena idea, pero no quiero utilizar los nombres predeterminados para los archivos MDF y LDF. Quiero que esos tengan un sello de fecha incluido. Para hacer esto, necesitaría especificar los nombres de los archivos cuando creo la base de datos temporal, lo que me lleva a necesitar la ruta predeterminada. – RichieACC

+0

Un truco que podría funcionar para usted es crear la base de datos con un nombre que incluya la marca de tiempo completa y luego cambiar el nombre del DB a lo que se supone que debe ser. Renombrar el DB no cambia los nombres de los archivos.De esa forma, los archivos se crean con el nombre correcto. –

+0

Darrel, para especificar el nombre del archivo, debe especificar la ruta completa. SQL no parece tener ningún concepto de rutas relativas. – RichieACC

4

Una forma sería usar la misma ubicación que la base de datos maestra. Puede consultar la instancia de SQL Server para que, con el siguiente SQL:

select filename from master.dbo.sysdatabases where name = 'master' 

que devolverá la ruta completa de la base de datos maestra. Con esa ruta, puede usar el objeto FileInfo para extraer solo la parte del directorio de esa ruta. Eso evita el trabajo de adivinar al verificar el registro para la instancia de SQL Server a la que intenta conectarse.

+0

Esto no necesariamente devolverá el mismo resultado que la ruta predeterminada. La ruta predeterminada se puede cambiar después de que se creó la base de datos maestra, y la base de datos maestra no necesita moverse con ella. – RichieACC

+0

En ese caso, deberá leer la clave de registro HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ MSSQL.X, donde X es el número de instancia y verificar si se han definido DefaultData y DefaultLog. –

+0

¿Cómo sabría que está buscando el número de instancia correcto? Todo lo que tengo que trabajar es el nombre de la instancia. No tendré ningún acceso a la máquina que no sea mi código que se está ejecutando en él. – RichieACC

Cuestiones relacionadas