質問: あるアプリケーションから新しいバージョンのアプリケーションにデータを転送するコードを記述しようとしています。 古いアプリケーションも新しいアプリケーションもSQL Serverを使用します。古いデータベースは、2つの主な領域でうまく設計されていません。外部キーを適切に使用していないため、不要なテーブルが追加されています(たとえば、これだけでなく、ルックアップテーブルが使用される)。 私は、これを行う "正しい"方法はSSISを使用すると信じていますが、私はこれについての経験はなく、正確にセットアップする方法を把握するのに苦労しているので、コードベースのソリューション(コンソールアプリケーションを一度実行する)。 私はEFを使用して快適であるため、Entity Frameworkを使用してこれを達成する予定です。セットアップが簡単です。 問題の要点は関係を維持することです。関連するデータを維持するための最良の方法についてのガイダンスを探しています。たとえば、顧客には多くの住所があり、住所には顧客IDがあります。 それが簡単なのであれば、Customers、.Include(x => x.Address)というクエリを実行して、これを使ってCustomersを新しいデータベースに追加することができます(途中でターゲットデータベースに新しいIDを自動的に作成)。しかし、かなりの数のテーブル(〜30)がすべて何らかの方法でリンクされているため、データの行が多数あるため、データがメモリにロードされる必要があるため、これは面倒でかなり集中しているように感じます。 1ヒット(私もデータを変換する必要があるため)。 代わりにSET IDENTITY INSERTを実行して、新しいテーブルに古いIDを維持しながらテーブルを1つずつコピーしますが、これは間違っているようです。 SSISコースで自分自身を送る以外に、他の選択肢はありますか?
回答: SSISは、さまざまなソース/宛先からのデータの変換に適しています。両方のデータベースがSQL Serverを使用している場合は、SQLクエリを介してのみテーブル構造を移行する方法を検討します。 EFは可能ですが、特にデータベースサーバー上で実行されない場合は、処理速度が低下し、リソースがより多く消費されます。 (ワイヤとバックのデータ) 例えば、私はFKでOrderIdを使用するために移行したい "OrderNumber"を通じてOrderテーブルに関連するテーブルを持っていました。新しいテーブルを構造化して、OrderIdをNullableとして含めるとともに、OrderNumberも含めます。通常、列が削除されることを示すための下線が付きます。私は一時的な列に指示された注文番号を持つデータをインポートし、OrderIdを更新するために2回目のパスを実行します。 OrderIdがすべて考慮されている(残っているヌル値がない)ことをサニティ・チェックした後、OrderId列をnull不可能にし、FKおよび制約を確立して、余分なOrderNumber_列をドロップすることができます。これらの変更を実行するときは、制約/インデックスなしでテーブルを設定し、データが移植された後にテーブルを作成する方が一般的に適しています。新しいFKを完成させる前に、提案されたデータ構造を分割して、一度にテーブルを転送/再関連付けしてください(より速いですが、データが正確かつ完全に渡ってくることを合理的に確かめたい)。複雑なシナリオでも一時テーブルを利用できます。これはすべて、コンセプトの証明として復元されたバックアップで実行され、スクリプト化され、バックアップされた本番サーバー上で実行されるように設定され、完成してテストされていれば幸いです。 サポートされている列挙型とルックアップテーブルを組み合わせると、ルックアップテーブルを削除するよりもよいでしょう。ルックアップテーブルに対するFKの値は、DBレベルでの参照整合性の強化を支援し、クエリ時に任意の値に意味を提供するのに役立ちます。私は、通常、列挙型に関連付けられたルックアップテーブルの接尾辞として、 "Enum"を指標としてこれらのテーブルがコードによって管理され、読み込み専用である必要があることを示します。 Insert / Update / Deleteトリガーを設定して、これらの表の変更を防止することもできます。 (enumを拡張する必要があるときに更新スクリプトを無効にして再確立することができます)