【问题标题】:How do I create the deployment scripts from VS 2012 database projects?如何从 VS 2012 数据库项目创建部署脚本?
【发布时间】:2012-10-10 20:39:22
【问题描述】:

使用 VS2010 数据库项目,我可以定义目标(或不)数据库,设置操作(仅创建脚本或创建脚本并部署到目标),执行“部署”(通过 VS 或 MSBuild)并获得结果脚本。

我从未使用过“创建和部署”操作,因为我只是使用生成的脚本来构建安装程序,并且稍后会在安装过程中应用该脚本。

此功能允许我创建升级(仅自上一个版本以来的更改)或完整安装脚本(如果未指向目标数据库)。

在使用 VS 2012 或 SSDT 时,我似乎找不到正确的选项组合来重现此“仅脚本”行为以进行升级和完整安装。

我找到了this 问题,其中涵盖了如何在 VS 中单击按钮,但没有解决如何在 MSBuild 中完成此操作。

有人可以为我指出此特定配置的有用资源吗?

【问题讨论】:

    标签: sql-server deployment visual-studio-2012 sql-server-data-tools


    【解决方案1】:

    在破解了几个小时之后,我得到了一些可行的东西。它归结为两个重要元素:获取正确的发布 xml,以及 MSBuild 的正确参数。

    发布 xml 文件是使用 VS 创建的标准格式。好像是这样的……

    <?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <PropertyGroup>
        <IncludeCompositeObjects>True</IncludeCompositeObjects>
        <TargetDatabaseName>BLANK</TargetDatabaseName>
        <DeployScriptFileName>DeployTarget.sql</DeployScriptFileName>
        <TargetConnectionString>Data Source=SERVER;Integrated Security=True;Pooling=False</TargetConnectionString>
        <ProfileVersionNumber>1</ProfileVersionNumber>
        <ScriptDatabaseOptions>False</ScriptDatabaseOptions>
        <BlockOnPossibleDataLoss>True</BlockOnPossibleDataLoss>
        <CommentOutSetVarDeclarations>False</CommentOutSetVarDeclarations>
      </PropertyGroup>
    </Project>
    

    使用之前的项目格式,您可以将 Target DB 和连接字符串留空,它会生成一个“完整”的部署脚本。但是,在 SSDT sqlproj 文件中,您必须提供某些内容,即使它不正确,因此是“BLANK”数据库名称。如果我将其更改为实际数据库,它将生成一个增量脚本。

    C:\Windows\Microsoft.NET\Framework64\v4.0.30319\msbuild.exe /p:Configuration=Release;Platform=AnyCPU;SqlPublishProfilePath="<fullPathToPublishXML";UpdateDatabase=False /t:Rebuild,Publish "<fullPathToSqlProj>"
    

    这仍然不尊重发布 xml 中的 DeployScriptFileName(它创建一个与发布配置文件同名的 sql 文件),但似乎在文件中创建了正确的内容。

    【讨论】:

    • 欢迎提出任何改进上述答案的建议。我想我至少应该提出这个答案,以防有人可以使用它。
    • 感谢@StingyJack!您为我寻找一种为我的项目的 Prod DB 安装生成完整部署脚本的方法,为我节省了数小时的挫败感。我注意到,如果您将TargetDatabaseName 指定为BLANK,则脚本将生成内容以创建名为BLANK 的数据库。您可能想提一下,在生成完整脚本后应该删除或更改该部分。另外,我注意到如果我在上面的Data Source=SERVER 中没有有效的服务器。该脚本在 \bin 文件夹中生成,但预览炸弹。该脚本也是增量的。
    • DeployScriptFileName 不起作用,但 PublishScriptFileName 起作用。
    • 注意:这是针对 2010 年和 2012 年的项目,其中 VS 在 xml 中生成了 DeployScriptFileName。 PublishScriptFileName 不可用(我仍然无法在 3 分钟内找到关于它的文档)。
    • 如果您想跳过 publish.xml 文件并简单地传入值,请使用 /t:Rebuild,Deploy 而不是 /t:Rebuild,Publish。然后,您可以执行msbuild /p:Configuration=Release /p:Platform=AnyCpu /p:TargetDatabaseName=... /p:TargetConnectionString="..." /p:DeployScriptFileName=generated.sql /p:UpdateDatabase=False /t:Rebuild,Deploy "...path to sqlproj" 之类的操作。
    【解决方案2】:

    您在正确的轨道上,但您缺少一个参数。如果要提供脚本名称,则应在 msbuild 执行中使用以下参数:

    /p:PublishScriptFileName=[your output script.sql]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      相关资源
      最近更新 更多