Для надежности сначала я локально копирую файл .bak из сети, а затем пытаюсь восстановить его на локальном экземпляре SQL Server. Однако восстановление хочет восстановить файл БД в исходную папку, которая не существует локально. Как я могу указать ему использовать локальный каталог файлов экземпляра SQL по умолчанию?
public void RestoreDB(string file)
{
try
{
SqlConnection sqlConnection = new SqlConnection()
{
ConnectionString = $"Data Source=(LocalDB)\\MSSQLLocalDB;User ID=xx;Password=xx"
};
ServerConnection serverConnection = new ServerConnection(sqlConnection);
Server dbServer = new Server(serverConnection);
Restore restore = new Restore()
{
Action = RestoreActionType.Database,
Database = "DBTest",
NoRecovery = false,
ReplaceDatabase = true
};
restore.Devices.AddDevice(file, DeviceType.File);
restore.SqlRestore(dbServer);
}
catch (Exception ex)
{
throw ex;
}
}
.RelocateFiles
, которое, как и большинство вещей SMO, не имеет надлежащей документации (больше?), но этот ответ демонстрирует один возможное использование (которое можно упростить, если вы знаете все задействованные файлы). Насколько я знаю, для этого потребуются абсолютные пути - однако определение пути к данным локального экземпляра является отдельной задачей. Может потребоваться что-то вродеselect physical_name from master.sys.database_files
. - person Jeroen Mostert   schedule 28.01.2020DBServer.BackupDirectory
; это не обязательно будет соответствовать расположению файла базы данных. Помните также, что SMO — это всего лишь довольно тонкая оболочка для фактически выполняемых операторов; вы всегда можете подключить экземпляр Profiler, чтобы увидеть операторRESTORE
, который он на самом деле готовит, если есть какие-либо сомнения (или, если вы достаточно расстроены, вы можете даже написать код, который просто генерирует операторRESTORE
- мой предпочтительный подход, а не использование СМО вообще ни за что :-Р). - person Jeroen Mostert   schedule 28.01.2020