SSDT Как я могу создать новую базу данных из файла DACPAC?

В настоящее время для создания сценария используются инструменты командной строки SqlPackage.exe, сравнивающие файл DacPac с целевой базой данных. Это создаст базу данных, если она еще не существует.

Теперь мы хотим переключить это на использование пакета Nuget Microsoft.Data.Tools.Msbuild (используя C# для развертывания), но использование SchemaComparison to Compare завершится неудачно, если контейнер базы данных не существует. Там, кажется, не так много документации, связанной с пакетом.

Существуют ли какие-либо инструменты в составе этого пакета, которые позволят мне создать пустой контейнер базы данных перед сравнением?

В настоящее время я использую следующий код (который работает при сравнении с существующей базой данных):

 SchemaCompareDacpacEndpoint sourceDacpac = new SchemaCompareDacpacEndpoint(@"C:\DeployDB.dacpac");

        SqlConnectionStringBuilder csb = new SqlConnectionStringBuilder();
        csb.DataSource = @".";
        csb.InitialCatalog = "DeployTestDB";
        csb.IntegratedSecurity = true;
        SchemaCompareDatabaseEndpoint targetDatabase = new SchemaCompareDatabaseEndpoint(csb.ToString());


        SchemaComparison comparison = new SchemaComparison(sourceDacpac, targetDatabase);
        comparison.Options.DropObjectsNotInSource = true;
        comparison.Options.BlockOnPossibleDataLoss = false;
        comparison.Options.TreatVerificationErrorsAsWarnings = true;
        comparison.Options.ScriptDatabaseOptions = true;
        comparison.Options.GenerateSmartDefaults = true;

        SchemaComparisonResult comparisonResult = comparison.Compare();

на этом этапе ComparisonResult выдает сообщение об ошибке: {Ошибка SQL0: не удается открыть базу данных "DeployTestDB", запрошенную при входе в систему. Ошибка входа в систему. Ошибка входа пользователя myUsername.}

1 ответ

Взгляните на класс DacServices в Microsoft.SqlServer.Dac.dll.

Код будет выглядеть примерно так:

using Microsoft.SqlServer.Dac;

class Program
{
    static void Main(string[] args)
    {
        DacServices ds = new DacServices(@"Data Source=SERVERNAME;Initial Catalog=DATABASENAME;Integrated Security=true");
        using (DacPackage dp = DacPackage.Load(@"C:\temp\mydb.dacpac"))
        {
            ds.Deploy(dp, @"DATABASENAME", upgradeExisting: false, options: null, cancellationToken: null);
        }
    }
}
Другие вопросы по тегам