验证 DAC 包

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

最好在生产中部署 DAC 包之前查看其内容,并且在升级现有 DAC 之前验证升级操作。 当部署的包并非您的组织开发时更需要这样做。

升级 DAC 包的方法包括:

不受信任的 DAC 包

建议您不要从未知或不可信源部署 DAC 包。 此类 DAC 可能包含恶意代码,这些代码可能会执行非预期的 Transact-SQL 代码,或者通过修改架构导致错误。 使用来自未知来源或不可信来源的 DAC 前,应将其部署到独立的数据库引擎测试实例上,对数据库运行 DBCC CHECKDB (Transact-SQL),然后检查数据库中的代码,例如存储过程或其他用户定义的代码。

查看 DAC 的内容

有两种机制可用于查看数据层应用程序 (DAC) 包的内容:

  • 在 SQL Server Developer 工具中将 DAC 包导入某个 SQL 项目
  • 将 DAC 包发布到某个测试实例

在 SQL Server Developer 工具中导入 DAC

  1. 打开“文件”菜单,选择“新建”,然后选择“项目…”

  2. 选择 SQL Server 项目模板,然后指定 “名称”“位置”“解决方案名称”

  3. 在解决方案资源管理器中,右键单击该项目节点,然后选择“属性…”

  4. 在“项目设置” 选项卡上的“输出类型”部分中,选中“数据层应用程序(.dacpac 文件)”复选框,然后关闭属性对话框。

  5. 在解决方案资源管理器中,右键单击该项目节点,然后选择“导入数据层应用程序…”

  6. 使用“解决方案资源管理器”可打开该 DAC 中的所有文件,例如服务器选择策略以及预部署和部署后脚本。

  7. 使用 “架构视图” 可查看架构中的所有对象,特别是查看对象(例如函数或存储过程)中的代码。

将 DAC 包发布到某个测试实例

可以使用多种工具将 DAC 包发布到测试实例。 Azure Data Studio 的 SQL Server Dacpac 扩展 包含了“数据层应用程序向导”。 我们将演练将 DAC 包发布到测试实例的过程。

  1. 需要时可使用部署向导部署测试实例。

  2. 在 Azure Data Studio 中连接到测试实例,然后右键单击服务器节点。 从上下文菜单中选择“数据层应用程序向导”

  3. 在向导的步骤 1 中,选择“将数据层应用程序 .dacpac 文件部署到 SQL Server 实例”

  4. 在向导的步骤 2 中,输入文件位置,然后对于目标数据库选择“新建数据库”。 输入数据库名称。

  5. 在向导的步骤 3 中,检查摘要信息后选择“部署”

  6. 部署完成后,在对象资源管理器中查看数据库的内容。

  7. 可选:在对象资源管理器中右键单击数据库,然后选择“从数据库创建项目”以利用数据库生成 SQL 项目

查看数据库更改

将 DAC 的当前版本部署到生产后,可能已直接对关联的数据库进行了更改,这些更改可能与新版本 DAC 中定义的架构相冲突。 升级到新版本的 DAC 之前,检查是否已对数据库进行了此类更改。 在几种情况下,可能需要查看数据库和 DAC 包之间的差异。 例如,可能已直接对关联的数据库进行了更改,而这些更改可能与新版本 DAC 中定义的架构相冲突。

“所有数据库”

使用架构比较功能查看数据库更改

使用 SqlPackage CLI 查看数据库更改

SqlPackage CLI 可与 DeployReport 操作 结合使用,通过在将 .dacpac 发布到数据库时要执行的操作来查看 .dacpac 与数据库之间的差异。

注册为数据层应用程序的数据库

使用向导查看数据库更改

  1. 运行“升级数据层应用程序”向导,指定当前部署的 DAC 和包含新版本 DAC 的 DAC 包。

  2. “检测更改” 页上,查看已对数据库进行的更改的报告。

  3. 如果您不希望继续进行升级,则选择 “取消”

  4. 有关使用该向导的详细信息,请参阅 升级数据层应用程序

使用 PowerShell 查看数据库更改

  1. 创建一个 SMO Server 对象,并且将该对象设置为包含要查看的 DAC 的实例。

  2. 打开 ServerConnection 对象,并连接到同一实例。

  3. 在变量中指定 DAC 名称。

  4. 使用 GetDatabaseChanges() 方法检索 ChangeResults 对象,并且将该对象通过管道传递给某个文本文件,以便生成新的、已删除和已更改的对象的简单报表。

下面的示例报告了在名为 MyApplicaiton 的已部署 DAC 中进行的所有数据库更改。

## Set a SMO Server object to the default instance on the local computer.  
CD SQLSERVER:\SQL\localhost\DEFAULT  
$srv = get-item .  
  
## Open a Common.ServerConnection to the same instance.  
$serverconnection = New-Object Microsoft.SqlServer.Management.Common.ServerConnection($srv.ConnectionContext.SqlConnectionObject)  
$serverconnection.Connect()  
$dacstore = New-Object Microsoft.SqlServer.Management.Dac.DacStore($serverconnection)  
  
## Specify the DAC instance name.  
$dacName  = "MyApplication"  
  
## Generate the change list and save to file.  
$dacChanges = $dacstore.GetDatabaseChanges($dacName) | Out-File -Filepath C:\DACScripts\MyApplicationChanges.txt  

使用 SqlPackage CLI 查看数据库更改

SqlPackage CLI 可以与 DriftReport 操作 结合使用,用来查好看从上次注册以来对数据库做出的更改。

查看升级操作

“所有数据库”

使用 SQL 项目发布功能查看数据库更改

使用 SqlPackage CLI 查看升级操作 SqlPackage CLI 可与 DeployReport 操作 结合使用,通过在将 .dacpac 发布到数据库时要执行的操作来查看 .dacpac 与数据库之间的差异。

注册为数据层应用程序的数据库

在使用新版本 DAC 包升级从早期版本 DAC 包部署的 DAC 之前,可以生成一个报告,其中包含在升级期间将运行的 Transact-SQL 语句,然后检查这些语句。

使用向导报告升级操作

  1. 运行“升级数据层应用程序”向导,指定当前部署的 DAC 和包含新版本 DAC 的 DAC 包。

  2. “摘要” 页上,查看升级操作的报告。

  3. 如果您不希望继续进行升级,则选择 “取消”

  4. 有关使用该向导的详细信息,请参阅 升级数据层应用程序

使用 PowerShell 报告升级操作

  1. 创建一个 SMO Server 对象,并将该对象设置为包含部署的 DAC 的实例。

  2. 打开 ServerConnection 对象,并连接到同一实例。

  3. 使用 System.IO.File 加载 DAC 包文件。

  4. 在变量中指定 DAC 名称。

  5. 使用 GetIncrementalUpgradeScript() 方法来获取升级时将运行的 Transact-SQL 语句的列表,然后将该列表通过管道传递给某个文本文件。

  6. 关闭用于读取 DAC 包文件的文件流。

以下示例报告了在将名为 MyApplicaiton 的 DAC 升级到 MyApplication2017.dacpac 文件中定义的架构时将运行的 Transact-SQL 语句。

## Set a SMO Server object to the default instance on the local computer.  
CD SQLSERVER:\SQL\localhost\DEFAULT  
$srv = get-item .  
  
## Open a Common.ServerConnection to the same instance.  
$serverconnection = New-Object Microsoft.SqlServer.Management.Common.ServerConnection($srv.ConnectionContext.SqlConnectionObject)  
$serverconnection.Connect()  
$dacstore = New-Object Microsoft.SqlServer.Management.Dac.DacStore($serverconnection)  
  
## Load the DAC package file.  
$dacpacPath = "C:\MyDACs\MyApplication2017.dacpac"  
$fileStream = [System.IO.File]::Open($dacpacPath,[System.IO.FileMode]::OpenOrCreate)  
$dacType = [Microsoft.SqlServer.Management.Dac.DacType]::Load($fileStream)  
  
## Specify the DAC instance name.  
$dacName  = "MyApplication"  
  
## Generate the upgrade script and save to file.  
$dacstore.GetIncrementalUpgradeScript($dacName, $dacType) | Out-File -Filepath C:\DACScripts\MyApplicationUpgrade.sql  
  
## Close the filestream to the new DAC package.  
$fileStream.Close()  

比较 DAC

在升级 DAC 之前,最好检查当前 DAC 和新 DAC 之间数据库和实例级别对象中的差别。 如果您对于当前 DAC 没有该包的副本,则可以从当前数据库中提取一个包。

如果您在 SQL Server 开发工具中将两个 DAC 包都导入 DAC 项目中,则可以使用架构比较工具来分析这两个 DAC 之间的差别。

或者,将 DAC 解压缩到单独的文件夹。 然后,可以使用 WinDiff 实用工具之类的差异工具分析这些差异。

另请参阅

数据层应用程序
部署数据层应用程序
升级数据层应用程序