【问题标题】:How do I publish a SSDT Database from code如何从代码发布 SSDT 数据库
【发布时间】:2015-11-30 15:52:48
【问题描述】:

我们有SQLServer01.Publish.xml,当我双击这个文件并发布时,它会将一个数据库发布到sqlServer01。

我想问一下,我们能否以某种方式从代码中发布此配置文件?

【问题讨论】:

标签: c# .net sql-server vb.net sql-server-data-tools


【解决方案1】:

SSDT 似乎喜欢 DacPac 的这种东西。 Microsoft.SqlServer.Dac 中有一个 DacServices 实用程序类。我认为这将需要在您计划运行此代码的机器上安装 SSDT。

public class DacPacUtility
{
    public void DeployDacPac( string connString, string dacpacPath, string targetDbName )
    {
        var dbServices = new DacServices( connString );

        var dbPackage = DacPackage.Load( new FileStream( dacpacPath, FileMode.Open, FileAccess.Read ), DacSchemaModelStorageType.Memory, FileAccess.Read );

        var dbDeployOptions = new DacDeployOptions()
        {
            SqlCommandVariableValues =
            {
                new KeyValuePair< string, string >( "debug", "false" )
            },
            CreateNewDatabase = true,
            BlockOnPossibleDataLoss = false,
            BlockWhenDriftDetected = false
        };

        dbServices.Deploy( dbPackage, targetDbName, upgradeExisting : true, options : dbDeployOptions );
    }
}

奖励:您可以使用 Microsoft.Build.Evaluation.Project 命名空间新建一个 Project 对象并在本地构建它以使用生成的构建 dacpac 初始化测试进行集成测试。

[SetUpFixture]
public class TestSetup
{
    [SetUp]
    public void SetUpTests()
    {
        var projectPath = @"C:SomeDirectory";
        var project = new Project( projectPath );
        project.Build();
        ProjectCollection.GlobalProjectCollection.UnloadProject( project );

        var dacPac = new DacPacUtility();
        var connString = "Data Source=(localdb)\ProjectsV12;Initial Catalog=Tests;Integrated Security=True";
        var dacPacPath = projectPath + "..\bin\projectName.dacpac";
        dacPac.DeployDacPac(connString, dacPacPath, "Tests");
     }
     [TearDown]
     public void TearDownTests()
     {
       // TODO: delete db or run other cleanup scripts
     }
 }

参考文献

Deborah's Developer MindScape: Deploying A DACPAC

Latest SSDT

SSDT for VS 2010

在哪里可以得到Microsoft.SqlServer.DacDacService

有两种方法可以获取Microsoft.SqlServer.Dac 库:

【讨论】:

  • 谢谢回复,但是找不到DACServices,是不是因为我们用的是2008R2和vs2010?
  • 警告:虽然大部分都很棒,但我建议不要使用new FileStream 来加载 dacpac;如果您依赖于另一个 dacpac,例如 master.dacpac,并且 SDK 未部署在运行该代码的机器上,它将无法在同一目录中找到它(引擎尝试执行的操作)因为从引擎的角度来看,没有目录,只有一个流。相反,只需传递文件的路径,让引擎处理它。
  • 谢谢@Tipx!你的小费给我省了很多麻烦。要使参考结果起作用,您还需要 DacDeployOptions 中的“IncludeCompositeObjects = true”。 @Ashtonian 您能否根据这些 cmets 更新答案?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多