SQL 项目中的系统对象

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Microsoft Fabric 预览版中的 SQL 数据库

SQL 项目在项目生成过程中验证数据库对象引用。 默认情况下,SQL 项目不包含数据库模型中的系统对象,如果项目包含对系统对象的引用,则可能会导致验证错误。 若要解决这些验证错误,您应将数据库引用包含到项目目标平台的 master.dacpac 中。

master.dacpac可以在 Microsoft.Build.Sql SDK 样式的 SQL 项目中添加数据库引用为包引用,也可以在 SDK 样式和原始 SQL 项目中将其添加为制品引用

添加包引用

可用的系统数据库包包括:

添加对 SQL 项目的包引用的最直接方法是使用 .NET 命令行接口 (CLI)。 以下示例将对 Azure SQL 数据库 master 系统数据库的包引用添加到 SQL 项目:

dotnet add <path-to-sqlproj> package Microsoft.SqlServer.Dacpacs.Azure.Master

此命令将以下条目添加到 .sqlproj 文件(包版本将反映运行命令时可用的最新版本):

...
    <ItemGroup>
        <PackageReference Include="Microsoft.SqlServer.Dacpacs.Azure.Master" Version="170.0.1" />
    </ItemGroup>
</Project>

添加工件引用

VS Code 和 Visual Studio SQL 项目接口提供了一种方法,可以为项目的目标平台添加到 master.dacpac 文件的工件引用。

生成的对.sqlproj文件的编辑将类似于以下示例,其中在 Visual Studio 中的系统数据库中添加了 Azure SQL 数据库master的工件引用。

<ItemGroup>
    <ArtifactReference Include="$(DacPacRootPath)\Extensions\Microsoft\SQLDB\Extensions\SqlServer\AzureV12\SqlSchemas\master.dacpac">
      <HintPath>$(DacPacRootPath)\Extensions\Microsoft\SQLDB\Extensions\SqlServer\AzureV12\SqlSchemas\master.dacpac</HintPath>
      <SuppressMissingDependenciesErrors>False</SuppressMissingDependenciesErrors>
      <DatabaseVariableLiteralValue>master</DatabaseVariableLiteralValue>
    </ArtifactReference>
  </ItemGroup>

master.dacpac这些文件是从应用程序的安装位置引用的,对于某些 CI/CD 系统来说可能很脆弱。 可以将 master.dacpac 文件复制到您的解决方案内的某个位置,如果生成系统不包含系统数据库文件,则需要更新 IncludeHintPath 属性以指向该位置。

Fabric 中的 SQL 数据库

Fabric 系统对象中的 SQL 数据库包含在包中 Microsoft.SqlServer.Dacpacs.DbFabric ,但为 Fabric 环境中的 SQL 数据库正确配置数据库引用可能需要执行其他步骤。

使用 Fabric 中的集成源代码管理创建的 SQL 项目包括包引用和 DatabaseVariableLiteralValue 属性设置为 master。 此属性是必需的,因为 Fabric 中的 SQL 数据库不提供对 master 数据库的访问权限,但可以在用户数据库中引用相同的系统对象。

如果在 Visual Studio 或 VS Code 中创建新的 SQL 项目,则必须更新 DatabaseVariableLiteralValue 属性以 master 匹配 Fabric 环境中 SQL 数据库中使用的数据库名称。

  <ItemGroup>
    <PackageReference Include="Microsoft.SqlServer.Dacpacs.DbFabric">
      <SuppressMissingDependenciesErrors>False</SuppressMissingDependenciesErrors>
      <DatabaseVariableLiteralValue>master</DatabaseVariableLiteralValue>
      <Version>170.0.0</Version>
    </PackageReference>
  </ItemGroup>