比较数据库和项目

适用于: SQL Server Azure SQL 数据库 Azure SQL 托管实例

了解数据库和 SQL 项目之间的对象定义差异可以提供有关数据库和项目状态的宝贵见解,包括在正在进行的开发或回归故障排除期间。 SQL 项目包括直观显示差异的工具、分析更新数据库所需的更改、将数据库中的更改导入 SQL 项目文件集以及查看将要执行的 T-SQL 脚本以更新数据库来匹配项目。

本文将回顾使用不同方法比较数据库和 SQL 项目的方法:

  • 可以使用架构比较直观显示数据库和/或项目之间的差异。 此比较有助于确定需要在数据库和项目之间同步的更改。
  • 可以使用部署报表汇总和自动查看更新数据库所需的更改。
  • 可以使用架构比较或 SqlPackage 提取数据库的更改导入到 SQL 项目文件集中。
  • 可以使用 SqlPackage 部署脚本架构比较查看 T-SQL 语句,这些语句将被执行以更新数据库来匹配项目。

架构比较:直观显示差异

先决条件

Visual Studio 中的 SDK 式 SQL 项目预览版中尚不提供图形架构比较功能。 使用 Azure Data Studio 或 Visual Studio 比较架构。

架构比较需要图形工具,例如 Visual Studio 或 Azure Data Studio。

总结

架构比较提供了视觉上最丰富的界面,用于了解数据库和项目之间的差异。 架构比较的一个关键功能在于比较的方向性是可逆的。 因此,可以使用架构比较来了解要部署到数据库的项目中的更改,或者要添加到项目中的数据库的更改。 可以使用架构比较来确定对象定义的差异,例如表、视图、存储过程和函数。

可以使用完整的差异集或所选子集将更改应用于数据库或项目。 架构比较还可以生成部署脚本,该脚本在运行时可以有效地将更改应用于数据库。

架构比较概述中详细了解架构比较。

部署报表:查看更改

部署报表需要 SqlPackage CLI。

dotnet tool install -g Microsoft.SqlPackage

总结

部署报表提供更新数据库以匹配项目所需的更改的摘要。 SqlPackage CLI 通过将源模型(.dacpac SQL 项目生成项目或数据库)与目标数据库进行比较来生成部署报表。 例如,以下命令为从名为 MyDatabase 的 SQL 项目为名为 MyProject 的数据库生成部署报表:

dotnet build MyProject.sqlproj
sqlpackage /Action:deployreport /SourceFile:bin/Debug/MyProject.dacpac /TargetConnectionString:{connection string for MyDatabase} /OutputPath:deployreport.xml

生成的 XML 是部署计划的简化形式,汇总了运行数据库部署时将执行的操作。 以下操作列表并不详尽:

  • Create
  • Alter
  • Drop
  • Refresh
  • UnbindSchemaBinding
  • UnbindFulltextIndex
  • TableDataMotion
  • SPRename
  • EnableChangeTrackingDatabase
  • DisableChangeTrackingDatabase

可以在文本编辑器或 Visual Studio 中查看部署报表,该报表类似于以下内容:

<?xml version="1.0" encoding="utf-8"?>
<DeploymentReport xmlns="http://schemas.microsoft.com/sqlserver/dac/DeployReport/2012/02">
    <Alerts />
    <Operations>
        <Operation Name="Create">
            <Item Value="[CO].[Products].[IX_Products_CategorySlug]" Type="SqlIndex" />
        </Operation>
        <Operation Name="Alter">
            <Item Value="[CO].[Brands]" Type="SqlTable" />
            <Item Value="[CO].[AddProductImage]" Type="SqlProcedure" />
        </Operation>
        <Operation Name="Refresh">
            <Item Value="[CO].[SelectStarView]" Type="SqlView" />
        </Operation>
    </Operations>
</DeploymentReport>

部署报表可用于查看更改,并监视潜在的高影响事件,例如数据运动或聚集索引创建/删除。 这些事件将列在 Alerts 元素下的部署报表中。

部署报表 XML 操作的优点在于,它可用于自动查看更新数据库所需的更改。 可以分析 XML 并将其用于生成报表或基于列出的操作或对象名称触发警报。

从数据库导入更改

架构比较部分所述,架构比较可用于将数据库中的更改应用到 SQL 项目文件集。 对 SQL 项目应用更改是一种常见方案,当您有一个直接开发的数据库,并且 SQL 项目用于管理源控件中的数据库对象时。 通过 Visual Studio 或 Azure Data Studio 手动完成此操作可能非常耗时,尤其是在数据库具有很多对象或零星更改时。 在本部分中,我们将回顾如何将对象定义从数据库自动提取到 SQL 项目文件集中。

先决条件

重点专注于自动执行,我们使用 SqlPackage CLI 将对象定义从数据库提取到 SQL 项目文件集中。 Microsoft.Build.Sql.Templates .NET 模板用于创建 SQL 项目文件(可选步骤)。

# install SqlPackage CLI
dotnet tool install -g Microsoft.SqlPackage

# install Microsoft.Build.Sql.Templates
dotnet new install Microsoft.Build.Sql.Templates

总结

SqlPackage 提取命令采用源数据库,并生成输出数据库模型,作为 .dacpac 文件或一组 SQL 脚本。 SqlPackage 默认设置为生成 .dacpac 文件,但 /p:ExtractTarget= 属性可用于指定一组 SQL 脚本。 以下命令将数据库 MyDatabase 提取到文件夹中 MyDatabaseProject 中的 SQL 项目文件集中:

sqlpackage /Action:Extract /SourceConnectionString:{connection string for MyDatabase} /TargetFile:MyDatabaseProject /p:ExtractTarget=SchemaObjectType

当文件夹位于源控件下时,提取的对象定义将显示源控件工具的差异。 通过使用 SqlPackage 生成文件并检查源控件中的差异,可以自动执行将更改从数据库导入 SQL 项目文件集的过程。

在一系列的三个命令中,我们可以删除以前的文件集、提取数据库,并检查源控件工具的差异:

rm -rf MyDatabaseProject
sqlpackage /Action:Extract /SourceConnectionString:{connection string for MyDatabase} /TargetFile:MyDatabaseProject /p:ExtractTarget=SchemaObjectType
git status --porcelain | wc -l

输出是最新的 SqlPackage 提取更改的文件数。 git status 命令的输出可用于触发其他自动化步骤。 如果想要将此文件集用作 SQL 项目,可以使用 Microsoft.Build.Sql.Templates .NET 模板在文件夹 MyDatabaseProject 中创建 SQL 项目文件:

dotnet new sqlproj -n MyDatabaseProject -o MyDatabaseProject

查看部署 T-SQL 脚本

架构比较部分所述,架构比较可用于生成更新数据库以匹配 SQL 项目所需的 T-SQL 脚本。 在本部分中,我们将回顾如何使用 SqlPackage 自动生成更新数据库以匹配 SQL 项目所需的 T-SQL 脚本,以便将其存储为管道项目以供审查和批准。

先决条件

dotnet tool install -g Microsoft.SqlPackage

总结

使用 SqlPackage 运行 SQL 项目部署会使用发布操作,但如果想要查看执行的 T-SQL 脚本,可以使用脚本操作。 以下命令生成更新名为 MyDatabase 数据库以匹配名为 MyProject 的 SQL 项目所需的 T-SQL 脚本:

dotnet build MyProject.sqlproj
sqlpackage /Action:Script /SourceFile:bin/Debug/MyProject.dacpac /TargetConnectionString:{connection string for MyDatabase} /DeployScriptPath:Deployment.sql