如何验证 DAC 包

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

查看 DAC 的内容

有两种机制可用于查看 DAC 包的内容。您可以在 Microsoft Visual Studio 2010 中创建一个 DAC 项目,然后将 DAC 包导入到该项目中。您可以将该包的内容解压缩到一个文件夹中。

安全说明安全说明

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

查看 DAC 包内容的方法之一是在 Microsoft Visual Studio 2010 中创建一个 DAC 项目,然后将 DAC 包导入到该项目中。之后,可以使用**“解决方案资源管理器”打开该 DAC 中的所有文件,例如服务器选择策略以及预部署和部署后脚本。您可以使用“架构视图”**查看架构中的所有对象,特别是查看对象中的代码,例如函数或存储过程。

如果您没有访问 Visual Studio 2010 的权限,则可以将该 DAC 的内容解压缩到某一文件夹。然后,您可以在 SQL Server Management Studio 的数据库引擎查询编辑器中打开 Transact-SQL 脚本,并且在记事本之类的工具中打开文件。有关说明,请参阅如何解压缩 DAC 包

使用向导验证升级

在升级 DAC 前,最好首先检查是否存在在初始 DAC 部署后对数据库进行的更改,并且查看升级将进行的更改的脚本。您可以使用“升级数据层应用程序向导”查看此信息;您可以在**“检测更改”页上查看数据库更改,并且在“摘要”页上查看升级操作。如果您不想执行升级,则在“摘要”页上单击“取消”**。有关详细信息,请参阅如何升级数据层应用程序

使用 PowerShell 查看数据库更改

在使用新版本的 DAC 包升级从早期的 DAC 包部署的 DAC 之前,查看是否存在可能影响升级的对数据库的更改。

注意注意

本文中的 PowerShell 示例使用在 DAC Framework 1.1 功能包中引入的方法。您可以从该网页下载此功能包。

创建包含以下代码的 PowerShell 脚本 (.ps1) 文件:

  1. 添加代码以便创建一个 SMO Server 对象,并且将该对象设置为包含要升级的 DAC 的实例。该示例将服务器对象设置为本地计算机上的默认实例:

    ## Set a SMO Server object to the default instance on the local computer.
    CD SQLSERVER:\SQL\localhost\DEFAULT
    $srv = get-item .
    
  2. 添加代码以便打开一个 ServerConnection 对象并连接到相同的实例。

    ## 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)
    
  3. 添加代码以便指定以前部署的 DAC,然后创建 ChangeResults 对象并且将其加入到某个文本文件中以便生成新的、删除的和更改的对象的简单报表。

    ## 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
    

从您已加载了 SQL Server PowerShell 管理单元的 PowerShell 会话或者通过使用 sqlps 命令提示实用工具,运行 .ps1 文件。

使用 PowerShell 生成升级脚本

在使用新版本的 DAC 包升级从早期的 DAC 包部署的 DAC 之前,您可以生成一个脚本文件,该文件包含在升级期间将运行的 Transact-SQL 语句,然后查看该脚本。创建包含以下代码的 PowerShell 脚本 (.ps1) 文件:

  1. 添加代码以便创建一个 SMO Server 对象,并且将该对象设置为包含要升级的 DAC 的实例。该示例将服务器对象设置为本地计算机上的默认实例:

    ## Set a SMO Server object to the default instance on the local computer.
    CD SQLSERVER:\SQL\localhost\DEFAULT
    $srv = get-item .
    
  2. 添加代码以便打开一个 ServerConnection 对象并连接到相同的实例。

    ## 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)
    
  3. 添加代码以便加载 DAC 包文件。此示例加载 MyApplication.dacpac 文件

    ## Load the DAC package file.
    $dacpacPath = "C:\MyDACs\MyApplication.dacpac"
    $fileStream = [System.IO.File]::Open($dacpacPath,[System.IO.FileMode]::OpenOrCreate)
    $dacType = [Microsoft.SqlServer.Management.Dac.DacType]::Load($fileStream)
    
  4. 添加代码以便指定以前部署的 DAC,然后创建一个 Transact-SQL 脚本并将其加入到某一 .sql 文件中。关闭用于读取新的 DAC 包的文件流。

    ## 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()
    

从您已加载了 SQL Server PowerShell 管理单元的 PowerShell 会话或者通过使用 sqlps 命令提示实用工具,运行 .ps1 文件。

比较 DAC

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

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

如果您没有访问 Visual Studio 2010 的权限,则可以将这两个 DAC 分别解压缩到单独的文件夹中。然后,可以使用 WinDiff 实用工具之类的不同工具分析这些差异。