验证 DAC 包
最好在生产中部署 DAC 包之前查看其内容,并且在升级现有 DAC 之前验证升级操作。 当部署的包并非您的组织开发时更需要这样做。
**开始之前:**先决条件
**若要升级 DAC,请使用:**查看 DAC 的内容、查看数据库更改、查看升级操作、比较 DAC
先决条件
建议您不要从未知或不可信源部署 DAC 包。 此类 DAC 可能包含恶意代码,这些代码可能会执行非预期的 Transact-SQL 代码,或者通过修改架构导致错误。 使用来自未知源或不可信源的 DAC 前,请在数据库引擎的独立测试实例上部署它,对数据库运行 DBCC CHECKDB (Transact-SQL),然后检查数据库中的代码,例如存储过程或其他用户定义的代码。
[返回页首]
查看 DAC 的内容
有两种机制可用于查看数据层应用程序 (DAC) 包的内容。 您可以在 SQL Server 开发工具中将 DAC 包导入到某一 DAC 项目。 您可以将该包的内容解压缩到一个文件夹中。
在 SQL Server 开发工具中查看 DAC
打开**“文件”菜单,选择“新建”,然后选择“项目…”**。
选择 SQL Server 项目模板,然后指定**“名称”、“位置”和“解决方案名称”**。
在**“解决方案资源管理器”中,右键单击该项目节点,然后选择“属性…”**。
在**“项目设置”选项卡上的“输出类型”部分中,选中“数据层应用程序(.dacpac 文件)”**复选框,然后关闭属性对话框。
在**“解决方案资源管理器”中,右键单击该项目节点,然后选择“导入数据层应用程序…”**。
使用**“解决方案资源管理器”**可打开该 DAC 中的所有文件,例如服务器选择策略以及预部署和部署后脚本。
使用**“架构视图”**可查看架构中的所有对象,特别是查看对象(例如函数或存储过程)中的代码。
[返回页首]
查看文件夹中的 DAC
按照解压缩 DAC 包中的说明将 DAC 包解压缩到一个文件夹中。
通过在 Management Studio 中的数据库引擎查询编辑器中打开 Transact-SQL 脚本来查看其内容。
在记事本等工具中查看文本文件的内容。
[返回页首]
查看数据库更改
将 DAC 的当前版本部署到生产后,可能已直接对关联的数据库进行了更改,这些更改可能与新版本 DAC 中定义的架构相冲突。 升级到新版本的 DAC 之前,检查是否已对数据库进行了此类更改。
使用向导查看数据库更改
运行**“升级数据层应用程序”**向导,指定当前部署的 DAC 和包含新版本 DAC 的 DAC 包。
在**“检测更改”**页上,查看已对数据库进行的更改的报告。
如果您不希望继续进行升级,则选择**“取消”**。
有关使用此向导的详细信息,请参阅升级数据层应用程序。
使用 PowerShell 查看数据库更改
创建一个 SMO Server 对象,并且将该对象设置为包含要查看的 DAC 的实例。
打开 ServerConnection 对象,并连接到同一实例。
在变量中指定 DAC 名称。
使用 GetDatabaseChanges() 方法检索 ChangeResults 对象,并且将该对象加入到某个文本文件中以便生成新的、已删除和已更改的对象的简单报表。
[返回页首]
查看数据库更改示例 (PowerShell)
查看数据库更改示例 (PowerShell)
下面的示例报告已在名为 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
[返回页首]
查看升级操作
在使用新版本的 DAC 包升级从早期的 DAC 包部署的 DAC 之前,您可以生成一个报告,该报告包含在升级期间将运行的 Transact-SQL 语句,然后查看该语句。
使用向导报告升级操作
运行**“升级数据层应用程序”**向导,指定当前部署的 DAC 和包含新版本 DAC 的 DAC 包。
对**“摘要”**页上,查看升级操作的报告。
如果您不希望继续进行升级,则选择**“取消”**。
有关使用此向导的详细信息,请参阅升级数据层应用程序。
[返回页首]
使用 PowerShell 报告升级操作
创建一个 SMO Server 对象,并将该对象设置为包含部署的 DAC 的实例。
打开 ServerConnection 对象,并连接到同一实例。
使用 System.IO.File 加载 DAC 包文件。
在变量中指定 DAC 名称。
使用 GetIncrementalUpgradeScript() 方法可获取升级时将运行的 Transact-SQL 语句的列表,然后将该列表加入到文本文件中。
关闭用于读取 DAC 包文件的文件流。
[返回页首]
查看升级操作示例 (PowerShell)
查看升级操作示例 (PowerShell)
以下示例报告一些 Transact-SQL 语句,为了将名为 MyApplicaiton 的 DAC 升级到 MyApplicationVNext.dacpac 文件中定义的架构将运行这些语句。
## 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\MyApplicationVNext.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 实用工具之类的差异工具分析这些差异。
[返回页首]