什么是 SQL 数据库项目?

适用于: Microsoft Fabric 中的 SQL Server 2022 (16.x) 及更高版本 Azure SQL 数据库Azure SQL 托管实例SQL 数据库

SQL 数据库项目是 SQL 对象的本地表示形式,这些对象包含了用于某一个数据库的架构(例如,表、存储过程或函数)。 SQL 数据库项目的开发周期使数据库开发能够集成到作为开发最佳做法所熟悉的持续集成和持续部署 (CI/CD) 工作流中。

概述

SQL 项目基于声明性 T-SQL 语句。 在 SQL 数据库项目代码中,将每个对象创建一次。 如果需要更改有关该对象的某些内容,例如添加列或更改数据类型,可以修改第一次也是唯一一次声明对象的单个文件。

生成 SQL 数据库项目时,输出项目为 .dacpac 文件。 可以通过将 .dacpac 发布到目标数据库来更新新数据库和现有数据库以匹配 .dacpac 的内容。

围绕数据库代码的 SQL 数据库项目框架,该框架使用其生成过程将两个基本功能添加到该文件集:

  • 针对特定版本的 SQL 验证对象之间的引用和语法
  • 将生成项目部署到新的数据库或现有数据库

包含预先部署脚本、后期部署脚本和数据库对象的 SQL 数据库项目的摘要屏幕截图。

SQL 数据库项目的功能由 Microsoft.SqlServer.DacFx .NET 库提供,并显示在多个 SQL 开发工具中。 DacFx 具有多个扩展点,例如修改部署步骤,以及创建自定义规则以供代码分析的功能。 适用于 SQL 项目的项目 SDK Microsoft.Build.Sql建议进行新的开发 ,并且是适用于 Azure Data Studio 和 VS Code 的 SQL 数据库项目扩展使用的格式。 Visual Studio 中对 SDK 样式 SQL 项目的支持为预览版。

验证

生成 SQL 项目后,将验证对象之间的关系。 例如,视图定义不能包含 SQL 项目中不存在的表或列。

此外,SQL 项目在其称为“.sqlproj”的 文件中包含属性。 在生成过程中使用此信息来验证该版本的 SQL 中是否存在函数和 T-SQL 语法。 例如,在 SQL Server 2022 中添加的 JSON 函数不能用于设置为 Sql140 (SQL Server 2017) 目标平台的 SQL 项目。

若要生成 SQL 项目,从命令行运行 dotnet 生成。 在支持 SQL 项目(Azure Data Studio、VS Code 和 Visual Studio)的图形工具中,有一个用于生成 SQL 项目的菜单项。

生成进程的控制台输出可能包含错误(生成失败)或警告。 生成警告可以在对象名称和其他可自定义的最佳做法中包含不一致的大小写,但不会让生成失败。

生成过程的项目输出是一个 .dacpac 文件,在使用 bin/Debug 文件夹中的默认设置生成中,可找到该文件。

部署

输出文件,即 .dacpac,是一个功能强大、可重用和声明性项目。 使用此文件,可以使用 SqlPackage 或其他工具将数据库代码应用于数据库。 要部署 .dacpac 的 SqlPackage 命令是 publish 命令。

SQL 项目生成到 dacpac 并部署到数据库的过程概述的屏幕截图。

例如,sqlpackage /Action:Publish /SourceFile:yourfile.dacpac /TargetConnectionString:{yourconnectionstring}

新数据库

SqlPackage 导航对象关系,以便在将 dacpac 发布到新数据库时按正确的顺序创建每个对象。 例如,当 Table_B 具有 Table_A 的外键时,SqlPackage 会在 Table_B 之前创建 Table_A。

你不想执行整个 SQL 脚本文件夹,尤其是在可能使用 SQL 项目时,这些项目会根据对象关系按正确的顺序自动执行每个 T-SQL 部分。

现有数据库

除了在发布到新数据库时导航对象层次结构之外,.dacpac 发布过程还会在确定更新该数据库所需的步骤之前计算源 .dacpac 数据库和目标数据库之间的差异。 例如,如果 Table_C 在数据库中缺少它在 SQL 项目中的两列,并且 StoredProcedure_A 被更改,SqlPackage 将创建一个 ALTER TABLE 语句和一个 ALTER PROCEDURE 语句,而不是盲目地尝试创建一堆对象。

部署计算的示例 alter table 语句的屏幕截图。

发布命令提供给现有数据库的灵活性不限于单一数据库。 可以多次部署一个 .dacpac ,例如升级一百个数据库组成的舰队时。

使用时机

SQL 数据库项目非常适合希望将数据库开发集成到 CI/CD 工作流的团队。 SQL 项目的声明性性质允许数据库架构的单一事实来源,生成和发布过程提供了一种可重复且可靠的方法来部署对数据库的更改。

SQL 数据库项目用于跟踪数据库状态的真实来源,包括使用对象关系映射器 (ORM)(如 EF Core)进行开发。 无论用于创建数据库的 ORM 如何,都可以使用图形工具或命令行将数据库的架构提取到 SQL 项目。

打开了 AdventureWorks SQL 项目的 VS Code 屏幕截图,其中显示了编辑器中的表。

SQL 数据库项目支持 SQL Server 和 Azure SQL 系列数据库,包括 Azure SQL 数据库和 Azure Synapse Analytics。 无论是开发应用程序还是数据仓库,都可以使用 SQL 数据库项目来管理数据库的架构。 可从 Visual Studio、VS Code 和 Azure Data Studio 中的工具开发 SQL 项目。

原始项目与 SDK 样式项目

Microsoft.Build.Sql SDK 样式项目格式基于 .NET Core 中引入的新 SDK 样式项目,是用于 Azure Data Studio 和 VS Code 的 SQL 数据库项目扩展使用的格式。 Microsoft.Build.Sql 项目将替换基于 MSBuild(.NET Framework)的原始 SQL 项目格式。 对 Visual Studio 中的 SDK 样式 SQL 项目的支持目前处于预览状态,并且正在开发中,Visual Studio 中提供了原始项目和 SDK 样式的项目格式。

新的开发工作应考虑使用 Microsoft.Build.Sql 项目,因为 SDK 样式项目是将来将支持的格式。 SDK 样式的项目格式更灵活,包含原始 SQL 项目中不提供的新功能:

  • .NET 8 支持(跨平台)
  • 数据库引用的 NuGet 包引用
  • 项目中 .sql 文件的默认 globbing 模式

SDK 样式的项目具有来自原始 SQL 项目的功能超集,现有 SQL 项目可以通过修改项目文件转换为 SDK 样式的项目。

功能覆盖率的例外是支持需要 .NET Framework 的 SQLCLR 对象。 包含 SQLCLR 对象的项目可以转换为 SDK 样式项目,但项目需要 .NET Framework,并且必须在 Windows 上的 Visual Studio 中生成。 生成具有 SQLCLR 对象的项目后,.dacpac 可以在 .NET 和 .NET Framework 上使用 SqlPackage 进行部署,并可用作项目中 .dacpac 引用(同一数据库或同一服务器不同数据库)。