数据库项目部署 - 没有提供文件供参考 master.dacpac

Jen*_*hea 3 database-project sql-server-data-tools azure-devops

我是第一次设置数据库项目,我正在尝试使用 Azure DevOps 进行构建/部署。我正在使用 Azure (windows-2019) 中托管的 MSBuild 任务进行构建。我正在使用在 SQL 服务器上运行的命令行任务从 C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\140.

在使用 SqlPackage.exe 部署期间,我收到 master 和 msdb 数据库的错误:

No file was supplied for reference master.dacpac; deployment might fail. When C:\Jen_DacpacTest\Artifact\whatever.dacpac was created, the original referenced file was located C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO\2019\ENTERPRISE\COMMON7\IDE\EXTENSIONS\MICROSOFT\SQLDB\EXTENSIONS\SQLSERVER\140\SQLSCHEMAS\MASTER.DACPAC.
Run Code Online (Sandbox Code Playgroud)

我认为对 master 和 msdb 的引用是在构建和部署时解决的(因为它是路径的变量),但似乎并非如此。它似乎在构建期间弄清楚 $(DacPacRootPath) 是什么,并对生成到 dacpac 中的 model.xml 文件中的引用进行“硬编码”。proj 文件中的引用如下所示:

<ArtifactReference Include="$(DacPacRootPath)\Extensions\Microsoft\SQLDB\Extensions\SqlServer\140\SqlSchemas\master.dacpac">
      <HintPath>$(DacPacRootPath)\Extensions\Microsoft\SQLDB\Extensions\SqlServer\140\SqlSchemas\master.dacpac</HintPath>
      <SuppressMissingDependenciesErrors>False</SuppressMissingDependenciesErrors>
      <DatabaseVariableLiteralValue>master</DatabaseVariableLiteralValue>
    </ArtifactReference>
    <ArtifactReference Include="$(DacPacRootPath)\Extensions\Microsoft\SQLDB\Extensions\SqlServer\140\SqlSchemas\msdb.dacpac">
      <HintPath>$(DacPacRootPath)\Extensions\Microsoft\SQLDB\Extensions\SqlServer\140\SqlSchemas\msdb.dacpac</HintPath>
      <SuppressMissingDependenciesErrors>False</SuppressMissingDependenciesErrors>
      <DatabaseVariableLiteralValue>msdb</DatabaseVariableLiteralValue>
    </ArtifactReference>
Run Code Online (Sandbox Code Playgroud)

如果 dacpac 被解压,那么它在 model.xml 文件中的样子如下:

<CustomData Category="Reference" Type="SqlSchema">
    <Metadata Name="FileName" Value="C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO\2019\ENTERPRISE\COMMON7\IDE\EXTENSIONS\MICROSOFT\SQLDB\EXTENSIONS\SQLSERVER\140\SQLSCHEMAS\MASTER.DACPAC" />
    <Metadata Name="LogicalName" Value="master.dacpac" />
    <Metadata Name="ExternalParts" Value="[master]" />
    <Metadata Name="SuppressMissingDependenciesErrors" Value="False" />
</CustomData>
<CustomData Category="Reference" Type="SqlSchema">
    <Metadata Name="FileName" Value="C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO\2019\ENTERPRISE\COMMON7\IDE\EXTENSIONS\MICROSOFT\SQLDB\EXTENSIONS\SQLSERVER\140\SQLSCHEMAS\MSDB.DACPAC" />
    <Metadata Name="LogicalName" Value="msdb.dacpac" />
    <Metadata Name="ExternalParts" Value="[msdb]" />
    <Metadata Name="SuppressMissingDependenciesErrors" Value="False" />
</CustomData>
Run Code Online (Sandbox Code Playgroud)

所以我想知道这应该如何工作,因为托管在 Azure 中的 Azure MSBuild 任务(和 Visual Studio 构建任务)将从 Visual Studio Enterprise 文件夹中引用 master 和 msdb dacpacs,但在 SqlPackage 所在的 SQL Server 上。运行 exe 以进行部署,这些文件位于 BuildTools 文件夹而不是 Enterprise 文件夹中。(而且我真的不认为我应该在我的 SQL 服务器上安装 VS 企业版才能让它工作?)

在 Azure 中: C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO\2019\\**ENTERPRISE**\\COMMON7\IDE\EXTENSIONS\MICROSOFT\SQLDB\EXTENSIONS\SQLSERVER\140\SQLSCHEMAS

在 SQL Server 上: C:\Program Files (x86)\Microsoft Visual Studio\2019\\**BuildTools**\\Common7\IDE\Extensions\Microsoft\SQLDB\Extensions\SqlServer\140\SQLSchemas

构建服务器上这些文件的路径必须与 sql 服务器上的路径完全匹配,这似乎很奇怪。我认为找到这些 dacpac 引用会更神奇,因为据我所知,您不应该手动将它们添加到您的项目中并将它们拖到任何地方。

Lan*_*SFT 6

数据库项目部署 - 没有提供文件供参考 master.dacpac

这是一个典型的 SSDT 问题。生成服务器上这些文件的路径不是问题的主要原因。

请检查没有提供文件供参考 ABC.dacpac; 部署可能会失败并出现错误:无法解析来自名为“master.dacpac”的源的外部元素的引用

尝试将 复制master.dacpac到您xx.dacpac所在的同一文件夹。(您可以通过copy/xcopy在 cmd 中使用命令来执行此操作)并确保您的 CMD 任务的工作目录在同一文件夹中。希望能帮助到你 :)