Я пытаюсь скопировать базу данных SQL Server в новую базу данных на том же сервере без передачи данных (то есть, я пытаюсь создать идентичный , пустая база данных).Сбой SMO.Transfer из-за входа в систему LocalAdmin, но только для некоторых баз данных
Приведенный ниже код корректно работает с образцовой базой данных, созданной специально для тестирования. Но когда применяется к фактической целевой базе данных, она терпит неудачу при вызове .TransferData()
(после нескольких секунд выполнения) с ошибкой System.Data.SqlClient.SqlException : 'LocalAdmin' is not a valid login or you do not have permission.
Учетная запись, под которую я разрабатываю и тестирую программу, может использоваться для входа в экземпляр SQL Server, о котором идет речь, и выполнять создание базы данных и создавать объекты как в исходной, так и в целевой базе данных.
После сбоя база данных, указанная в targetDb , имеет, по сути, была создана, но в ней нет таблиц или других структур.
Может ли кто-нибудь сказать мне, как исправить следующий код, чтобы он смог успешно скопировать мою структуру базы данных?
/* Ref: Microsoft.SqlServer.ConnectionInfo.dll
Microsoft.SqlServer.Management.Sdk.Sfc.dll
Microsoft.SqlServer.Smo.dll
Microsoft.SqlServer.SmoExtended.dll
Microsoft.SqlServer.SqlEnum.dll */
using Microsoft.SqlServer.Management.Smo;
using System;
using System.Diagnostics;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
CopyEmptyDatabase(@"server_name\instance_name", "sourceDb_name", "targetDb_name");
}
public static void CopyEmptyDatabase(string instance, string sourceDb, string targetDb)
{
var server = new Server(instance);
var transferAgent = new Transfer(server.Databases[sourceDb]);
transferAgent.CopyAllObjects = true;
transferAgent.DropDestinationObjectsFirst = true;
transferAgent.CopySchema = true;
transferAgent.CopyData = false;
// Transfer requires the target DB to exist
var target = new Database(server, targetDb);
target.Create();
transferAgent.DestinationServer = instance;
transferAgent.DestinationDatabase = targetDb;
transferAgent.DestinationLoginSecure = true;
transferAgent.Options.IncludeIfNotExists = true;
try
{
transferAgent.TransferData();
}
catch (Exception exc)
{
Debug.Print(exc.Message);
throw;
}
}
}
}
Когда вы создаете новую базу данных, какие логин и пользователь вы используете для добавления схем? –
Также как SSMS имеет сценарии, которые делают весь этот процесс быстрым. Щелкните правой кнопкой мыши по базе данных в своем проекте Explorer, выберите команду «Сценарии» и установите флажок, чтобы добавить все соответствующие объекты для всего. Существует опция включения схемы и метаданных, но по умолчанию она настроена только на ваши схемы. –
Нет воспроизведения. Ваш код отлично работает для меня. –