0

私は WiX で利用できる Sql Server カスタム アクションを使いこなせなくなったので、Deployment Tools Foundation を使用して独自のアクションを作成するという大胆な一歩を踏み出しました。私は良き市民になりたいと思っています。しかし、それを行う最良の方法は何ですか?

SQL Server 2005 以降のすべてのエディションをサポートする必要があります。

問題は、Windows Installer が 2 つのフェーズで動作することです。作業を実行し、元に戻す情報を保存します。次に、すべてのピースが配置されると、コミット (元に戻す情報を削除) するか、ロールバックを実行します。

これは、標準的なトランザクションが機能しないことを意味します。それらは私の Execute カスタム アクション内で完了する必要があり、後でロールバックする機会がありません。

必要に応じてロールバック アクションで復元できるデータベースのコピーのみのバックアップを作成することを検討しましたが、単純な方法には欠点があると思います。たとえば、データベースがどのくらい大きくなるかはわかりません。そのため、ターゲット マシンにバックアップを保持するための空き容量があるかどうかは保証できません。また、バックアップと復元が完了するまでに時間がかかる場合があり、通常のインストール (ロールバックが発生しない場合) が不必要に遅くなることは望ましくありません。

つまり、分散トランザクション コーディネーターが起動していることを確認し、変更を行う前に分散トランザクションを初期化し、適切なカスタム アクションでコミットまたはロールバックします。

TransactionInteropクラスのメンバーを使用して、異なるカスタム アクション間でトランザクションを共有できるようにする Cookie をエクスポートできるようです。

この種の経験を持つ人は、それがうまくいく可能性があるかどうかを言うことができますか?

4

2 に答える 2

2

一部のデータベース/インスタンス操作はトランザクション内で実行できません (例: CREATE/ALTER/DROP ENDPOINT)。その他の操作は分散トランザクション内で実行できません (例: SAVE TRANSACTION)。したがって、提案された計画ではそれらをまったく実行できません。また、コミットされていないトランザクション内で実行する場合、DB アップグレード スクリプトはすべて正しく機能する必要があります。

バックアップ/復元パスをたどるリスクが少ないと言えます (または、代わりにデータベース スナップショットを作成し、ロールバック時にスナップショットから復元しますが、EE が必要になるという欠点があります)。

また、オプションとして、アップグレード中undoにすべてのdoスクリプトを実行するためのスクリプトを用意し、ロールバック中に元に戻すスクリプトを実行して、インストールの影響を取り除くこともできます。これは難しい問題であり、開発 (およびテスト) しなければならないスクリプトの量がおそらく 2 倍になり、開発者の厳しい規律が必要になることは理解しています。

于 2010-08-09T16:23:12.110 に答える
1

私は何年にもわたってSQLスクリプトを使用してかなりの数のインストーラーを実行してきましたが、これはローカルMSDE / MySQLデータベースを備えたVBアプリや、コードのローカルストアのような単純なデータベースにのみ適していると思います。別の場所で同期するのを待つ間、テーブルのルックアップと一時的なコミット。

産業用の強力なエンタープライズアプリタイプの状況に入ると、最初の実行タイプのストーリーとして、DB構成をインストーラーからアプリケーションに取り込むのが好きです。そこでC#を使用すると、MSIに制約されることなく、より重いリフティングを実行できます。

于 2010-08-09T17:06:05.233 に答える