C # SQL Восстановление базы данных в расположение данных по умолчанию - PullRequest
6 голосов
/ 15 сентября 2008

Я пишу приложение на C #, которое загружает сжатую резервную копию базы данных по FTP. Затем приложению необходимо извлечь резервную копию и восстановить ее в расположении базы данных по умолчанию.

Я не буду знать, какая версия SQL Server будет установлена ​​на компьютере, на котором запущено приложение. Поэтому мне нужно найти местоположение по умолчанию на основе имени экземпляра (которое находится в файле конфигурации).

Все примеры, которые я обнаружил, имели раздел реестра, который они читали, но это не будет работать, поскольку предполагается, что установлен только один экземпляр SQL.

Другой пример, который я нашел, - создание базы данных, чтение свойств файла этой базы, удаление базы данных после того, как это было сделано. Это просто громоздко.

Я нашел что-то в .NET Framework, которое должно работать, например:

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

Проблема в том, что это возвращает пустые строки, что не помогает.

Мне также нужно выяснить учетную запись NT, под которой работает служба SQL, чтобы я мог предоставить этому пользователю доступ на чтение к файлу резервной копии после извлечения его.

Ответы [ 3 ]

9 голосов
/ 23 сентября 2008

Я обнаружил, что

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

возвращает ненулевое значение, только если явно не определен путь. Как только вы укажете путь, который не является значением по умолчанию, эта функция вернет этот путь правильно.

Итак, простой обходной путь - проверить, возвращает ли эта функция строку или ноль. Если он возвращает строку, используйте ее, но если она пуста, используйте

Microsoft.SqlServer.Management.Smo.Server(ServerName).Information.RootDirectory + "\\DATA\\"
4 голосов
/ 15 сентября 2008

Один из способов - использовать то же местоположение, что и основная база данных. Вы можете запросить экземпляр SQL Server для этого с помощью следующего SQL:

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

Это вернет полный путь к базе данных master. Используя этот путь, вы можете использовать объект FileInfo, чтобы извлечь только часть каталога этого пути. Это исключает необходимость проверки реестра для экземпляра SQL Server, к которому вы пытаетесь подключиться.

1 голос
/ 15 сентября 2008

Одним из вариантов, который может быть более простым решением, является создание новой базы данных на конечном сервере и затем ВОССТАНОВЛЕНИЕ поверх этой базы данных с помощью вашей резервной копии. Ваша резервная копия будет в нужном месте, и вам не придется возиться с «перемещением» файла резервной копии при восстановлении. SQL ожидает, что резервные копии будут восстановлены по тому же физическому пути, с которого они были скопированы. Если это не так, вы должны использовать опцию MOVE во время RESTORE. Это решение также облегчает переименование базы данных в процессе, если, например, вы хотите прикрепить дату к имени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...