1

Java と oracle 11g を使用している顧客向けの Web ベースのソリューションを開発しています。プロジェクトは顧客のためにインストールされますが、その機能のほとんどは開発中です。毎月、お客様のサイトにインストールする必要がある新しいバージョンをリリースします。問題は、各リリースで、DB (テーブル、ビュー、SP、トリガーなど) に多くの変更があることです。開発ラインからダンプを取得して顧客サイトに持ち込むことができません。

問題は、顧客 DB のスキーマを新しいバージョン (開発バージョン) に移行できる SQL スクリプトをどのように生成できるかということです。このスクリプトを生成するための自動ツールはありますか? それを行うことができるJavaのオープンソースコードはありますか? この問題のベスト プラクティスはありますか?

編集

回答によると、開発者が DB スキームを直接変更することを禁止し、DB 更新ごとに変更スクリプトを作成してコミットすることがベスト プラクティスのようです。しかし、この方法を使用すると、しばらくすると、多くの変更スクリプトが存在し、それぞれが特定の更新を DB に保持します。これらの大量のスクリプトを管理するにはどうすればよいですか?

4

2 に答える 2

5

あなたが説明する状況を考えると、あなたは以前のリリースと次のリリースの間のポイントツーポイント移行スクリプトを考え出すためにかなりの作業をしているということです。

データベース差分ツールは存在しますが、このブログ投稿で最もよく説明されている概念には一般的な欠陥があります。

http://blog.liquibase.org/2007/06/the-problem-with-database-diffs.html

TL; DR:差分ツールは、特定の変更のコンテキストを判別できません。たとえば、開発の過程で列名のスペルミスを修正した場合、テーブルにすでに保持されているデータを保持するために、既存のデータベースでRENAMECOLUMNコマンドを使用する必要があります。データベース差分ツールは、新しいスキーマに存在しない古い列と、同様に古いスキーマに存在しなかった新しい列のみを表示できました。そのため、ツールは古い列を削除して新しい列を追加しますが、その結果、元々その列にあったすべてのデータが失われます。

ベストプラクティスとして、データベースの変更を積極的に追跡することをお勧めします。DjangoやRubyonRailsなどの新しいWebフレームワークは、すぐに使用できる移行追跡をサポートしていますが、Javaの世界でもLiquibase(上記のリンク)などのオープンソースソリューションが存在します。私は現在の会社でLiquibaseを使用しており、これまでのところ、これらの移行コストを最小限に抑えることに大きな成功を収めています。私たちは、あなたが今直面しているまさにそのような移行を怠った後、切り替えを行いました。

幸運を!

于 2012-08-23T20:12:41.953 に答える
2

データベースの変更は、ソース管理に配置したスクリプトによってのみ行う必要があります。そうすれば、何を Qa に移行してから prod に移行するかを理解するのに多くの問題はありません。さらに、最後にスクリプトを作成して本番環境で初めて実行するのとは異なり、スクリプトはテスト済みです。さらに、一部の変更が別のプロジェクト用である場合、ソース管理の別のブランチにあるため、準備ができていないときに誤って本番環境に置かれることはありません。SQL コードはコードです。ソース管理に関しては、他のすべてのコードとまったく同じように扱う必要があります。

于 2012-08-23T20:23:28.403 に答える