2009-03-13 11 views
4

新しいDBデザインを使用してSQL Serverデータベースに移行するMS Accessデータベースがあります。 SQL Server DBを使用するアプリケーションの一部が既に書き込まれています。SSISを使用してデータベースを移行および正規化する

移行手順を最も簡単に実行する方法を調べるために、Microsoft SQL Server Integration Services(SSIS)を使い始めました。今、正規化の理由からテーブルを垂直に分割したいと思っています。

Aが構成された例は、この

MS Accessテーブル

ID 
Name 
Street 

SQL Serverテーブル

id 
name 

SQL Serverテーブルアドレスのように見えます

id 
person_id 
street 

SSISでどのようにこのタスクを完了することができますか? idカラムはidentity(autoincrement)カラムなので、古いIDは挿入できません。正しいperson_id外部キーをアドレステーブルに配置するにはどうすればよいですか?

テーブルが3つのテーブルに分割される場合もあります。テーブル2の行はテーブル1に属し、テーブル3の行はテーブル2に属します。

SSISはこれに適していますか?

EDIT これは1回限りの移行ですが、本番データベースが多用下にあるので、我々は、自動化された反復可能なプロセスを持っている必要があり、我々は最近の私達の開発環境での移行に取り組んでいるが、最新のデータではありません。移行のテストを1回実施し、顧客にその動作をレビューさせる予定です。 すべてがうまくいけば、、実際の移行に向かいます。

与えられたソリューションのほとんどには手作業の手順が多く含まれているため、適切ではありません。

答えて

3

execute SQLタスクを使用して、自分で文を記述します。

親テーブルの場合は、残りの部分については同じ手順を実行します。親テーブルのID挿入をONに設定し、古いIDを再利用するようにしてください。それはあなたのデータの整合性を維持するのに役立ちます。

+0

これは良い考えですが、私が正しく理解していれば、Access DBをまずSQL Serverにインポートする必要があります。 SQLタスクのソースと宛先の接続はありません。 – GrGr

+0

はい、最初に元のテーブルをインポートしてから操作をすべてSQL Server –

+0

にする方がよいので、最初にアクセスデータベースをインポートしますが、すべてのテーブル名を別のものに設定して一度だけ削除できますあなたはあなたのデータを分割しました。 – Eppz

3

AccessテーブルをSQL Serverに移行する場合は、SSMA, not the Upsizing Wizard from Accessを使用してください。
多くのツールを自由に使用できます。

次に、SQL Server内からテーブルを1つずつ分割することができます。
テーブルを自動的に分割するのに役立つツールがあるかどうかはわかりませんが、少なくとも見つけられませんでしたが、手動で行うことはあまり難しくありません。どのくらいの作業が必要ですか?最初の場所でVBAコードとフォームの元のテーブル。

サイドノート

正規化に関しては、それを船外に行っていない:私はあなたの例だけではなく、正規顧客の住所、必ず(?めったに)必要としないではありませんでした知っています。

人はいくつのアドレスを持つことができますか?
自宅の住所、会社の住所、配達先の住所、請求先の住所を数えた場合、それはおそらく最も必要なものです。
その場合、同じテーブルにそれらを保持する方が良いでしょう。そのデータを正規化すれば、再結合するためにはより多くの作業が必要になり、利点はありません。
もちろん、正規化するのは理にかなっているかもしれませんが、私はその考え方に惑わされている人たち(私はそれも有罪だと思う)を見た後、より複雑なクエリを作成してデータを分割し、開発とメンテナンスをより困難にし、しばしばプロセスでパフォーマンスの低下を被ります。

+0

サイドノートは真であり、私はそれを認識しています。アドレスに関しては、それは逆の方法です。私たちにはアドレスを持つ5つの異なるエンティティがあり、すべてがエンティティテーブルに格納されています。これを統一し、エンティティ間のアドレスのコピーを簡単にしたいと考えています。 – GrGr

+0

私は、私が作成した例では、1人のために多くのアドレスを持ちたいと考えています。しかし、あなたが言ったように。その例はそれだけでした。 – GrGr

1

アクセスはとても使いやすいですが、Accessでテーブルを正規化してから、完成した構造をそこからアップサイズしてみましょう。

+0

マイグレーションのための再現可能/自動化されたプロセスが必要です。私はAccess内でこれを行う方法を見ることはできません。 – GrGr

+0

アクセスには、あなたが必要とするものを何でもできるようにするはるかに柔軟なプログラミング言語があります。もちろん、別のデータベースで簡単に自動化できるように、別の言語を使用することもできます。 –

0

私はまだ言及して、私たちは、データフロータスクのすべての快適さとオプションを使用することができていなかった別の解決策が見つかりました:

先データベースがローカルのSQL Server上にある場合は、あなたが使用することができますがOLE DB宛先ではなくSQL Server宛先を持つデータフロータスク。 SQL Serverの宛先の場合、「IDの保持」オプションをマークすることができます。 (英語の名前が正しいかどうかはわかりません)これでID列に書き込むことができます

私たちはどこでも古いプライマリキーを使用することができません。複数のテーブルからレコードの結合を取る。

我々は、我々が最初に新しいスキーマ内の外部キーによって参照されるすべてのテーブルのすべてのold_id秒で埋める列

new_id (identity) 
old_id (int) 
old_tablename (string) 

で一時的なマッピングテーブルを構築することにより、プロセスを開始します。 new_idの値は、SQL Serverによって自動的に生成されます。

したがって、必要に応じてjoinを使用してold_idからnew_idに変換できます。 new_id値を使用して、新しいテーブルのID(主キー)列を「ID保持」オプションで満たし、外部キーのマッピングテーブルでジョインで簡単に検索できます。

0

また、Jamie ThomsonSSIS Normalizerコンポーネントを見ることもできます。私はちょうどそれについて今日知った(実際にはまだ試していない)。彼が投稿した例は、あなたの質問にあるようなものです。

関連する問題