SQL Server Data Tools (SSDT) 和 Data Tier Application Framework (DACFx) 是 Visual Studio 和 SQL Server 的插件,它们允许从开发到部署更好地管理 SQL 数据库。SSDT 提供了 Visual Studio 工具来开发数据库,而 DACFx 允许将这些数据库部署到 SQL Server 并进行管理。本文将介绍如何使用这些工具来实现数据库的版本管理,而不仅仅是简单地给数据库添加版本号。
为了更深入地了解 SSDT 和 DACFx,可以参考 Microsoft 的官方文档和相关代码项目文章。本文假设读者已经具备了 dacpacs 的基础知识,包括如何创建和部署它们。示例将使用 Visual Studio 2012、SQL Server 2012 以及截至 2012 年 12 月的最新版本 SSDT。但这些内容也适用于 Visual Studio 2010 和 SQL Server 2008。
SSDT 的关键概念是可以将数据库创建为“数据层应用程序”。这将数据库从普通的数据库提升为安装在机器上的完整应用程序。可以将其视为仅仅是将 exe 和 dll 复制到机器上与使用 MSI 安装应用程序之间的区别。
假设使用 Visual Studio 中的 SSDT 开发了数据库,现在希望将其部署为数据层应用程序。可以直接从 Visual Studio 或命令行进行部署。打开附带的源代码,将看到一个定义了非常简单数据库 'Library' 的 SSDT 项目示例。
可以通过在解决方案中右键单击项目并选择“发布...”来从 Visual Studio 发布此数据库。填写目标数据库连接信息并点击发布,数据库将被创建。要创建数据层应用程序,只需勾选“注册为数据层应用程序”复选框。
也可以通过命令行使用 DACFx 提供的 'sqlpackage.exe' 工具来完成此操作。在开发机器上,可以在 'C:\Program Files\Microsoft SQL Server\110\DAC\bin' 找到它。
sqlpackage.exe /Action:Publish /SourceFile:$DacPacPath /targetServerName:$TargetDataSource /TargetDatabaseName:$TargetDatabaseName /p:RegisterDataTierApplication=True
现在所做的不仅仅是发布数据库。数据库被“安装”在目标 SQL Server 上,这带来了一些额外的便利功能。
可以通过 Visual Studio 中的属性对话框设置数据库的版本号。然后,该版本号存储在 SQL Server 上,可以通过以下查询访问:
SELECT
*
FROM
[msdb].[dbo].[sysdac_instances]
这为数据层应用程序提供了版本号以及其他许多信息。但是,数据层应用程序不仅仅是版本号。
当创建数据层应用程序时,数据库模式的空副本实际上存储在 SQL Server 上。这个模式为提供了数据库的官方版本应该是什么样子的视图。
“漂移”衡量的是实时数据库的模式与注册版本之间的差异程度。安装后应该没有漂移。在生产环境中,这是一个有用的功能,可以跟踪任何未通过正式部署流程对数据库所做的更改。
例如,假设 DBA 执行了一些脚本,对生产数据库进行调整以提高性能或解决死锁问题。这些更改将在漂移报告中显示出来,因为 DBA 所做的更改没有通过 dacpac 发布路径。
需要使用 sqlpackage 命令行实用程序来创建漂移报告。
sqlpackage.exe /Action:DriftReport /TargetConnectionString:"Server=$DataSource;Database=$TargetDatabase;Integrated Security=SSPI;" /OutputPath:$DriftReport
例如,如果在发布 'Library' 示例数据库后立即运行以下命令,那么将得到一个空的漂移报告。
"C:\Program Files\Microsoft SQL Server\110\DAC\bin\sqlpackage.exe" /Action:DriftReport /TargetConnectionString:"Server=Localhost\SQL2012;Database=Library;Integrated Security=SSPI;" /OutputPath:"d:\Library_Drift_Report.xml"
但如果现在通过管理工作室直接删除 'Books' 表上的外键约束,漂移报告将如下所示:
<DriftReport xmlns="http://schemas.microsoft.com/sqlserver/dac/DriftReport/2012/02">
<Additions/>
<Removals>
<Object Name="[ForeignKeyConstraint_Book_Author]" Parent="[dbo].[Books]" Type="SqlForeignKeyConstraint"/>
</Removals>
<Modifications/>
</DriftReport>
如果数据库已经从其注册版本漂移,可以阻止发布数据库更新。如果想确保通过发布 dacpac 所做的数据库更新不会覆盖手动对数据库所做的任何更改,并突出显示数据库上的任何异常活动,这是一个有用的功能。