升级数据层应用程序

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

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

开始之前

DAC 升级是一个就地过程,此过程更改现有数据库的架构以匹配在新版本的 DAC 中定义的架构。 这一新版本的 DAC 在 DAC 包文件中提供。 有关创建 DAC 包的详细信息,请参阅 数据层应用程序

选择 DAC 升级选项

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

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

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

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

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

限制和局限

只能在 SQL 数据库、SQL Server 2005 (9.x) Service Pack 4 (SP4) 或更高版本中执行 DAC 升级。

先决条件

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

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

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

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

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

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

请确保有足够事务日志空间可用于记录所有修改。

安全性

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

权限

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

使用升级数据层应用程序向导

使用向导升级 DAC

  1. 在对象资源管理器中,右键单击包含要升级的 DAC 的数据库

  2. 展开“任务”选项,然后选择“升级数据层应用程序”选项

  3. 完成向导对话框:

    1. “简介”页

    2. “选择包”页

    3. “检测更改”页

    4. “选项”页

    5. 查看升级计划

    6. 摘要页

    7. “升级 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。

“检测更改”页

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

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

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

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

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

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

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

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

下一步 > - 继续到“选项”页。

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

“选项”页

使用此页可以选择用于升级的失败时回滚选项。

失败时回滚 - 选择此选项可以将升级封装在向导在出错时可尝试回滚的事务中。 有关该选项的详细信息,请参阅 选择 DAC 升级选项

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

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

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

“取消”- 终止向导且不部署 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

使用 PowerShell 脚本中的 IncrementalUpgrade() 方法升级 DAC

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

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

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

  4. 使用 add_DacActionStartedadd_DacActionFinished 订阅 DAC 升级事件。

  5. 设置 DacUpgradeOptions

  6. 使用 IncrementalUpgrade 方法升级 DAC。

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

示例 (PowerShell)

下面的示例使用 MyApplication2017.dacpac 包中的新 DAC 版本,升级数据库引擎的默认实例上名为 MyApplication 的 DAC。

## Set an 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)
  
## Subscribe to the DAC upgrade events.
$dacstore.add_DacActionStarted({Write-Host `n`nStarting at $(get-date) :: $_.Description})
$dacstore.add_DacActionFinished({Write-Host Completed at $(get-date) :: $_.Description})
  
## Upgrade the DAC and close the package.
$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
  
## Upgrade the DAC
$dacstore.IncrementalUpgrade($dacName, $dacType, $upgradeProperties)
## Close the package file.
$fileStream.Close()

另请参阅