FirebirdデータベースをMSSQLに移行する必要があります。元の作成者は、可変の主キーを持つようにデータベースを設計しました。たとえば、テーブルがあります
PRODUCTS with primary key (NAME,CATEGORY,SHORTNAME) and some data
PRICE_LISTING (NAME,CATEGORY,SHORTNAME) - foreign key to PRODUCT, and some data like price
PRODUCT_ALTERNATIVES (ORIGINAL_NAME,ORIGINAL_CATEGORY,ORIGINAL_SHORTNAME; REPLACEMENT_NAME,REPLACEMENT_CATEGORY,REPLACEMENT_SHORTNAME) - foreign keys to PRODUCTS
ご覧のとおり、製品名が変更されるたびに、他のテーブルの多くのデータを変更する必要があります。元の作成者は、外部キーのカスケード更新でこれを解決しました。いくつかの理由で、MS SQLでは外部キーに対してカスケード更新を使用できないため、データベースを簡単に移行できません。
さらに悪いことに、ソフトウェアには多くの編集画面があり、DataSets、DataGridViews、およびWindowsフォームのバインディングを使用しているため、エディターはほぼ自動的に機能します。たとえば、のエディタPRODUCTS
は単純なWindowsフォームであり、ユーザーが製品の名前を変更する(製品を変更するNAME
)たびに、変更はデータベースを介して(カスケード更新を介して)テーブルに伝達されPRICE_LISTING
ますPRODUCT_ALTERNATIVES
。また、アプリが価格表を表示したい場合は、SELECT * FROM PRICE_LISTING
製品名と価格を含む単純な操作を行います。
1つのアプローチは、代理キーを追加するID
ことです。各テーブルにID列を追加し、たとえばPRICE_LISTING
テーブルを(PRODUCT_ID, price
)などに変更します。しかし、価格を表示するには、次のようなビューを定義する必要があります。
SELECT *,PRODUCT.NAME,PRODUCT.CATEGORY,PRODUCT.SHORTNAME FROM PRICE_LISTING join PRODUCT on ...
次に、自動生成されたデータセットなどを変更して、ビューから選択し、ビューを更新する必要があります。
一言で言えば、元の作者の観点から、私たちはプログラムを壊し、それをより複雑にしています。単純な方法で移植した場合に機能しない唯一のことは、カスケード更新ですが、データベース設計には非常に欠陥があり、修正しないとメンテナンスの悪夢になると思います。
何をすべきか?