如何升级数据层应用程序

使用“升级数据层应用程序向导”或 Windows PowerShell 脚本可以更改当前部署的数据层应用程序 (DAC) 的架构和属性,以便匹配在 DAC 的新版本中定义的架构和属性。

就地升级和并行升级

有两种类型的 DAC 升级:

  • 并行升级在生成在 DAC 的新版本中定义了架构的新数据库时保留现有数据库的副本。然后,它将来自旧数据库的数据复制到新数据库。

  • 就地升级将更改现有数据库的架构,以便匹配在新的 DAC 版本中定义的架构。

SQL Server 2008 R2 和 Microsoft Visual Studio 2010 包括了仅支持并行升级的 DAC Framework 1.0。并行升级不支持 SQL Azure。SQL Server 2008 R2 Service Pack 1 (SP1) 和 Visual Studio 2010 SP1 都包含一个新的 DAC Framework 1.1,该组件引入了对 SQL Azure 和数据库引擎实例的就地升级。有关 DAC Framework 1.1 的详细信息,请参阅 对 SQL Server 对象和版本的 DAC 支持

原始版本的 DAC 升级向导使用 DAC Framework 1.0 来执行并行升级。SQL Server 2008 R2 SP1 中的向导版本执行就地升级。

SQL Server 2008 R2 用户可以通过安装 SQL Server 2008 R2 SP1 来升级到新向导和 DAC Framework 1.1。

准备升级

出于谨慎起见,在开始升级前应生成完整数据库备份。如果升级遇到了错误并且无法回滚其所有升级,可能需要还原该备份。

您应该采取若干操作以便验证 DAC 包和升级操作。有关如何执行这些检查的详细信息,请参阅如何验证 DAC 包

  • 建议您不要使用来自未知或不可信源的 DAC 包进行升级。此类 DAC 可能包含恶意代码,这些代码可能会执行非预期的 Transact-SQL 代码,或者通过修改架构导致错误。在使用来自未知或不可信源的 DAC 之前,请解压缩该 DAC 并检查代码,例如存储过程或者其他用户定义的代码。

  • 如果在部署了原始 DAC 后对当前数据库进行了更改,则某些更改可能会阻碍升级的成功完成,或者可能被升级删除。您应该首先查看在数据库中进行的任何此类更改的报告。

  • 出于谨慎起见,应该生成升级将执行的架构更改的列表,并且检查该列表以免有任何问题。

选择 DAC 升级选项

就地升级有四种升级选项:

忽略数据丢失 – 如果为 True,则即使某些操作导致数据丢失,升级也将继续。如果为 False,则上述操作将终止升级。例如,如果当前数据库中的表在新的 DAC 的架构中不存在,则在指定 True 时该表将被删除。默认设置为 True。

更改时阻止 - 如果为 True,则在数据库架构不同于在之前的 DAC 中定义的架构时,升级将终止。如果为 False,则即使检测到更改,升级也将继续。默认设置为 False。

失败时回滚 - 如果为 True,则升级将封装在事务中,并且在遇到错误时,将尝试回滚。如果为 False,则在进行更改时所有更改都将提交,并且在出错时,您可能要还原数据库的以前的备份。默认设置为 False。

跳过策略验证 - 如果为 True,将不评估 DAC 服务器选择策略。如果为 False,将评估策略,并且在存在验证错误时升级将终止。默认设置为 False。

要求

DAC 只能由 sysadminserveradmin 固定服务器角色的成员升级,或者由 dbcreator 固定服务器角色中具有 ALTER ANY LOGIN 权限的登录名升级。该登录名必须是现有数据库的所有者。名为 sa 的内置 SQL Server 系统管理员帐户也可以启动该向导。

DAC 包中的应用程序名称必须与当前已部署的 DAC 的应用程序名称匹配。例如,如果当前 DAC 的应用程序名称是 GeneralLedger,则只能通过使用其应用程序也是 GeneralLedger 的 DAC 包进行升级。

登录密码

为了提高安全性,SQL Server 身份验证登录名存储在 DAC 包中且没有任何密码。在部署或升级该包时,登录名将作为含有生成的密码的已禁用登录名创建。若要启用这些登录名,请使用具有 ALTER ANY LOGIN 权限的登录名登录,并且使用 ALTER LOGIN 来启用该登录名并且分配可以传达给用户的新密码。对于 Windows 身份验证登录名则无需执行此操作,因为其密码不是由 SQL Server 管理的。

空间注意事项

对于就地升级,在空间方面主要需要考虑的事项就是有足够可用的事务日志空间来记录所有修改。

并行升级除了创建新数据库并将现有数据复制到这个新数据库中之外,还为已部署的 DAC 保留当前数据库。您应该具有足够的可用磁盘空间来容纳与现有数据库一样大的新数据库。在运行并行升级前,请确保当前数据库中的数据量没有大到在新数据库中容纳不下。升级过程所创建的数据库将具有来自 CREATE DATABASE 语句的默认大小设置。对于一个数据文件,该默认设置是初始大小为 3MB,并且以 1MB 为增量且数目不限;对于一个日志文件,则初始大小为 1MB 并且最大大小限制是 2GB。

并行数据库选项

在并行升级中,在部署阶段中创建的数据库将具有来自 CREATE DATABASE 语句的几乎所有默认设置,只有以下方面除外:

  • 数据库排序规则和兼容级别设置为在 DAC 包中定义的值。从 Visual Studio 中的某一 DAC 项目生成的包将使用在该 DAC 项目中设置的值。从现有数据库中提取的包将使用来自原始数据库的值。

  • 您可以在**“更新配置”**页中调整某些数据库设置,例如数据库名称和文件路径。

某些数据库选项(例如 TRUSTWORTHY、DB_CHAINING 和 HONOR_BROKER_PRIORITY)不能作为部署过程的一部分进行调整。物理属性(例如文件组的数目或者文件的数目和大小)不能作为部署过程的一部分进行更改。在部署完成后,可以使用 ALTER DATABASE 语句、SQL Server Management Studio 或 SQL Server PowerShell 对数据库进行定制。有关详细信息,请参阅修改数据库

使用 PowerShell 就地 DAC 升级

该示例使用 DAC Framework 1.1 IncrementalUpgrade() 方法执行就地 DAC 升级。此方法将升级 SQL Server 或 SQL Azure 上的 DAC。建议通过安装 SQL Server 2008 R2 SP1 来获取新框架。

创建包含以下代码的 PowerShell 脚本(例如 IncrementalUpgradeDAC.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 包文件。此示例加载 MyApplicationVNext.dacpac 文件

    ## Load the DAC package file.
    $dacpacPath = "C:\MyDACs\MyApplicationVNext.dacpac"
    $fileStream = [System.IO.File]::Open($dacpacPath,[System.IO.FileMode]::OpenOrCreate)
    $dacType = [Microsoft.SqlServer.Management.Dac.DacType]::Load($fileStream)
    
  4. 添加代码以便订阅 DAC 部署事件。

    ## Subscribe to the DAC deployment events.
    $dacstore.add_DacActionStarted({Write-Host `n`nStarting at $(get-date) :: $_.Description})
    $dacstore.add_DacActionFinished({Write-Host Completed at $(get-date) :: $_.Description})
    
  5. 添加代码以便指定要升级的 DAC 和升级选项、升级 DAC 以及关闭 DAC 包文件:

    ## Upgrade the DAC and create the database.
    $dacName  = "MyApplication"
    ## Set the upgrade options.
    $upgradeProperties = New-Object Microsoft.SqlServer.Management.Dac.DacUpgradeOptions
    $upgradeProperties.blockonchanges = $true
    $upgradeProperties.ignoredataloss = $false 
    $upgradeproperties.rollbackonfailure = $true
    $upgradeProperties.skippolicyvalidation = $false
    ## Do not set IgnoreDrift, replaced by BlockOnChanges.
    
    ## Upgrade the DAC and create the database.
    $dacstore.IncrementalUpgrade($dacName, $dacType, $upgradeProperties)
    
    $fileStream.Close()
    

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

使用向导执行就地 DAC 升级

在 Management Studio 中,您可以通过在**“对象资源管理器”中打开“服务器”节点,选择“管理”节点,然后选择“数据层应用程序”节点,启动“升级数据层应用程序向导”。在“对象资源管理器”中右键单击某一数据层应用程序节点,然后选择“升级数据层应用程序…”**。

注意事项注意

原始版本的 SQL Server 2008 R2 中的 DAC 升级向导执行并行升级,但在 SQL Azure 上不支持并行升级。本节所述内容使用的是 SQL Server 2008 R2 SP1 中的新版本向导,该向导可以执行就地升级。

单击下面列表中的链接可以导航到向导中相关页的详细信息:

  • “简介”页

  • “选择包”页

  • “查看策略”页

  • “检测更改”页

  • 查看升级计划

  • “摘要”页

  • “升级 DAC”页

“简介”页

此页描述数据层应用程序的升级步骤。

不再显示此页。- 选中该复选框可以停止在将来显示此页。

下一步> - 继续到**“选择包”**页。

取消 - 终止向导且不升级 DAC。

“选择包”页

使用此页可以指定包含数据层应用程序的新版本的 DAC 包。该页可为两种状态。

选择 DAC 包

使用该页的初始状态可以选择要部署的 DAC 包。该 DAC 包必须是有效的 DAC 包文件,并且必须具有 .dacpac 扩展名。DAC 包中的 DAC 应用程序名称必须与当前 DAC 的应用程序名称相同。

DAC 包 - 指定包含数据层应用程序的新版本的 DAC 包的路径和文件名。您可以选择框右侧的**“浏览”**按钮以便浏览到 DAC 包的位置。

应用程序名称 - 一个只读框,它显示创作 DAC 或者从某一数据库中提取 DAC 时分配的 DAC 应用程序名称。

版本 - 一个只读框,它显示创作 DAC 或者从某一数据库中提取 DAC 时分配的版本。

说明 - 一个只读框,它显示创作 DAC 或者从某一数据库中提取 DAC 时编写的版本。

< 上一步 - 返回到**“简介”**页。

下一步 > - 在向导确认所选文件是有效的 DAC 包时显示一个进度栏。

取消 - 终止向导且不升级 DAC。

验证 DAC 包

在向导确认所选文件是有效的 DAC 包时显示一个进度栏。如果验证该 DAC 包,则向导将继续到**“查看策略”页。如果该文件不是有效的 DAC 包,则向导会保持在“选择 DAC 包”**页上。或者选择另一个有效的 DAC 包,或者取消该向导并且生成一个新的 DAC 包。

正在验证 DAC 的内容 - 报告验证过程的当前状态的进度栏。

< 上一步 - 返回到**“选择包”**页的初始状态。

下一步> - 继续到**“选择包”**页的最终形式。

取消 - 终止向导且不部署 DAC。

“查看策略”页

使用此页可查看评估 DAC 服务器选择策略的结果(如果该 DAC 具有策略)。该 DAC 服务器选择策略是可选的,并分配给在 Microsoft Visual Studio 中创作的 DAC。该策略使用该服务器选择策略方面指定数据库引擎的实例为承载该 DAC 而必须满足的条件。

策略条件的评估结果 - 一个只读报告,显示 DAC 服务器选择策略自己的条件评估是否成功。将在单独的行上报告对每个条件进行评估的结果。

忽略违反策略情况 - 使用此复选框可以在未能满足一个或多个策略条件的情况下继续进行升级。只有在您确保未满足的所有条件都不会阻碍 DAC 操作成功条件的情况下,才选择此选项。

< 上一步 - 返回到**“选择包”**页。

下一步 > - 继续到**“检测更改”**页。

取消 - 终止向导且不升级 DAC。

“检测更改”页

使用此页可以报告向导对所发生的数据库更改的检测结果,这些更改应该是使数据库架构不同于在 msdb 的 DAC 元数据中存储的架构定义的更改。例如,在最初部署 DAC 后使用 CREATE、ALTER 或 DROP 语句在数据库中添加、更改或删除对象。则该页将首先显示一个进度栏,然后报告分析的结果。

正在检测更改,这可能需要几分钟的时间 - 在向导检查数据库的当前架构和 DAC 定义中的对象之间的差异时显示一个进度栏。

更改检测结果: - 指示分析已完成并且在下面报告结果。

数据库 DatabaseName 尚未更改 - 向导检测到在数据库中定义的对象和 DAC 定义中其匹配对象之间没有差异。

数据库 DatabaseName 已更改 - 向导检测到数据库中的对象和 DAC 定义中其匹配对象之间发生了更改。

继续而不管可能的更改丢失 - 指定您理解当前数据库中的某些对象或数据在新数据库中将不存在,并且您愿意继续进行升级。只有在您对更改报告进行了分析并且了解您必须执行以便手动传输新数据库中所需的任何对象或数据的步骤后,才应选择此按钮。如果您不能确定,请单击**“保存报表”按钮以便保存更改报表,然后单击“取消”**。对报表进行分析,计划如何在升级完成后传输所需的任何对象和数据,然后重新启动该向导。有关详细信息,请参阅升级数据层应用程序

保存报表 - 单击此按钮可以保存向导检测到的数据库中对象和其在 DAC 定义中的匹配对象之间的更改的报表。然后,您可以查看该报表以确定是否需要在升级完成后执行一些操作,以便将报表中列出的某些或全部对象合并到新的数据库中。

< 上一步 - 返回到**“选择 DAC 包”**页。

下一步> - 继续到**“查看升级计划”**页。

取消 - 终止向导且不部署 DAC。

“查看升级计划”页

使用此页可以查看升级时要执行的操作。仅当确信升级不会导致问题时才继续。

将使用以下操作升级 DAC。 - 查看显示的信息以便确保将执行的操作是正确的。**“操作”列显示要用于执行升级的操作(如 Transact-SQL 语句)。“数据丢失”**列将包含在相关操作删除数据时给出的警告。

刷新 – 刷新操作列表。

保存操作报告 - 将操作窗口的内容保存到某一 HTML 文件。

继续而不管可能的更改丢失 - 指定您理解当前数据库中的某些对象或数据在新数据库中将不存在,并且您愿意继续进行升级。只有在您对更改报告进行了分析并且了解您必须执行以便手动传输新数据库中所需的任何对象或数据的步骤后,才应选择此按钮。如果您不能确定,请单击**“保存操作报告”按钮以保存更改报告,单击“保存脚本”按钮以保存 Transact-SQL 脚本,然后单击“取消”**。对报告和脚本进行分析,计划如何在升级完成后传输所需的任何对象和数据,然后重新启动该向导。有关详细信息,请参阅升级数据层应用程序

保存脚本 – 将用于执行升级的 Transact-SQL 语句保存为文本文件。

还原默认值 - 将选项恢复为默认设置 false。

< 上一步 - 返回到**“检测更改”**页。

下一步 > - 继续到**“摘要”**页。

取消 - 终止向导且不部署 DAC。

“摘要”页

使用此页可以查看在升级 DAC 时向导将执行的操作。

将使用以下设置升级 DAC。 - 查看显示的信息以便确保将执行的操作正确。该窗口将显示您选择要升级的 DAC 以及包含该 DAC 的新版本的 DAC 包。该窗口还显示数据库的当前版本是否与当前的 DAC 定义相同,或者显示数据库是否已更改。

< 上一步 - 返回到**“检测更改”**页。

下一步 > - 部署 DAC 并在**“升级 DAC”**页中显示结果。

取消 - 终止向导且不部署 DAC。

“升级 DAC”页

此页报告升级操作是成功还是失败。

升级 DAC - 报告为升级 DAC 而执行的每个操作是成功还是失败。查看信息以便确定每个操作是成功还是失败。遇到了错误的任何操作都将在**“结果”**列中具有一个链接。选择该链接可以查看针对该操作的错误报告。

保存报表 - 选择此按钮可以将升级报表保存到某一 HTML 文件。该文件报告每个操作的状态,并且包括任何操作生成的所有错误。默认文件夹是您的 Windows 帐户的 Documents 文件夹中的 SQL Server Management Studio\DAC Packages 文件夹。

完成 - 终止向导。

使用 PowerShell 的并行 DAC 升级

该示例使用 DAC Framework 1.0 Upgrade() 方法执行并行 DAC 升级。Upgrade() 方法将在下一版本的 SQL Server 中删除,并且不支持 SQL Azure。首选方法是使用上述的 DAC Framework 1.1 IncrementalUpgrade() 方法执行就地升级。

并行升级有两种升级选项:

  • IngoreDrift - 如果为 True,则即使检测到更改,升级也将继续。如果为 False,则在数据库架构不同于在之前的 DAC 中定义的架构时,升级将终止。

  • InvokeTSPolicy - 如果为 True,将评估 DAC 服务器选择策略,并且在存在验证错误时升级将终止。如果为 False,将不评估策略。

若要执行就地升级,请创建包含以下代码的 PowerShell 脚本(如 UpgradeDAC.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 包文件。此示例加载 MyApplicationVNext.dacpac 文件

    ## Load the DAC package file.
    $dacpacPath = "C:\MyDACs\MyApplicationVNext.dacpac"
    $fileStream = [System.IO.File]::Open($dacpacPath,[System.IO.FileMode]::OpenOrCreate)
    $dacType = [Microsoft.SqlServer.Management.Dac.DacType]::Load($fileStream)
    
  4. 添加代码以便订阅 DAC 部署事件。

    ## Subscribe to the DAC deployment events.
    $dacstore.add_DacActionStarted({Write-Host `n`nStarting at $(get-date) :: $_.Description})
    $dacstore.add_DacActionFinished({Write-Host Completed at $(get-date) :: $_.Description})
    
  5. 添加代码以便升级 DAC 和关闭 DAC 包文件:

    ## Upgrade the DAC and create the database.
    $dacName  = "MyApplication"
    $evaluateTSPolicy = $true
    $ignoreDriftOption = $true
    $upgradeProperties = New-Object Microsoft.SqlServer.Management.Dac.DacUpgradeOptions($evaluateTSPolicy, $ignoreDriftOption)
    $dacstore.Upgrade($dacName, $dacType, $upgradeProperties)
    $fileStream.Close()
    

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

请参阅

概念

更改历史记录

更新的内容

添加了有关使用 PowerShell 的部分。

添加了有关就地升级和 DAC Framework 1.1 功能包的信息。

SQL Server 2008 R2 SP1 同时包括 DAC Framework 1.1 和执行就地升级的新升级向导。