0

我已经超越了 WiX 中可用的 Sql Server 自定义操作,因此我采取了大胆的步骤,使用部署工具基础创建自己的操作。我想成为一个好公民,并确保我的支持回滚。但是最好的方法是什么?

我需要支持 SQL Server 2005 及更高版本的所有版本。

在我看来,问题在于 Windows Installer 分两个阶段工作:它完成工作,在执行过程中存储撤消信息。然后,当所有部分都到位时,它要么提交(删除撤消信息)要么回滚。

这意味着标准交易无法完成这项工作。它们必须在我的 Execute 自定义操作中完成,而且我以后没有机会回滚它们。

我考虑过对数据库进行仅复制备份,如果需要,我可以在回滚操作中恢复,但我认为这种方法虽然简单,但也有缺点。例如,我不知道我们的数据库会有多大——所以我不能保证目标机器上会有可用空间来保存备份。此外,备份和恢复可能需要一段时间才能完成,而且我不希望典型安装(不​​会发生回滚)过慢。

这让我想到了我目前最喜欢的想法:确保分布式事务协调器已启动,然后在进行更改之前初始化分布式事务,然后在适当的自定义操作中提交或回滚它。

看来我可以使用TransactionInterop类的成员来导出一个 cookie,使我能够在不同的自定义操作之间共享事务。

有这种事情经验的人能说一下它是否有可能奏效吗?

4

2 回答 2

2

某些数据库/实例操作不能在事务内部完成(例如 CREATE/ALTER/DROP ENDPOINT),而其他操作不能在分布式事务内部完成(例如 SAVE TRANSACTION)。因此,在您提出的计划中,您根本无法执行这些操作。此外,在未提交的事务中运行时,您的数据库升级脚本必须全部正常工作。

我想说沿着备份/恢复路径(或者创建数据库快照并在回滚时从快照恢复,缺点是需要 EE)的风险较小。

还有一个选项是在升级期间undo为每个do脚本运行一个脚本,并在回滚期间运行撤消脚本并删除安装的影响。我知道这是一个难题,可能会使必须开发(和测试...)的脚本数量增加一倍,并且需要一些严格的开发人员纪律。

于 2010-08-09T16:23:12.110 回答
1

多年来,我用 SQL 脚本完成了很多安装程序,我有点认为它只适用于简单的数据库,比如这里是我的带有本地 MSDE / MySQL 数据库的 VB 应用程序,或者这是我的本地代码商店表查找和临时提交,而我们等待在其他地方同步它。

一旦您进入工业强度的繁重企业应用程序类型的情况,我喜欢将我的数据库配置从安装程序中取出并作为首次运行类型的故事进入应用程序。您可以在那里使用 C# 进行更重的提升,而不受 MSI 的限制。

于 2010-08-09T17:06:05.233 回答