0

あるデータベース (Oracle) から別のデータベース (SQL Server) に 200,000 レコードを移行する必要があります。SSIS (SQL Server Integration Services) を使用して移行を管理し、既にパッケージを作成しています。

レコードはデータベース内のドキュメントを参照します (HBLOB フィールドを使用)。移行にはかなりの時間がかかるため、変数を境界として使用するクエリを使用して、レコードのサブセットのみを毎回移行するために、SSIS に変数を導入しました。このようにして、稼働日の前にいくつかの履歴レコードの移動を開始できます。

最初は、ID ごとに移動しますが、例として、最初のブロック 1'000 を取得し、次に 2 番目のブロックを取得するなどです。ただし、一部のドキュメント (本番システムにある) はまだ変更できるため、これは不可能です。したがって、まだ移動することはできません。

ここに制約があります:

If "Status" is closed   -> the document can be safely taken 
                           (other statuses are draft, pending).
If "CreatedDate" < 2010 -> the document can be moved without taking care of status.
  1. まず、すべての「古い」ドキュメント (2010 年より前に作成された) を移動できます。
  2. ステータスが「クローズ」のすべてのドキュメントを移動します。
  3. 稼働日には、残りのすべてのレコードを移行します。

ただし、このパターンでは、移動したドキュメントを追跡するのは簡単ではありません (ポイント [2])。その間に他のドキュメントがクローズ状態になる可能性があるためです。

重複やデータの欠落のリスクなしにこれらのレコードを移動するためのより良い手順を提案できる人はいますか?

4

1 に答える 1

1

移行されたドキュメントを追跡するステージング テーブルを使用してみてください。次に例を示します。

移行表

--------------------------------------------------
| MigratedDocId | MigrationTimeStamp    |  Other |
--------------------------------------------------
| 1             | anydate               |  blah  |
--------------------------------------------------
| 2             | anyotherdate          |  blah  |

ドキュメント ID (またはその他の PK) があると仮定すると、メイン テーブルは次のようになります。

--------------------------------------
| DocID    | Status  |  CreationDate |
--------------------------------------
| 1        | closed  |  2011         | (migrated according to [2])
--------------------------------------
| 2        | closed  |  2012         | (migrated according to [2])
--------------------------------------
| 3        | open    |  2011         | (*)
--------------------------------------
| 4        | any     |  2009         | (migrated according to [1])
--------------------------------------

ここで、(*) 行がオープンからクローズに変更されたと仮定すると、最初にこの行を移行先の DB チェックに移行する必要があります。

    SELECT * FROM MAINTABLE
    WHERE STATUS = 'closed'
    AND M.DOCID NOT IN ( SELECT MIGRATEDDOCID FROM MIGRATIONTABLE )

JOIN や EXCEPT (私は 2 番目の方が好み) など、どのような方法でもクエリを改善できますが、(*) 行のみを取得する最も簡単な方法を次に示します。次に、移行後に DocID を Migration Table に挿入します。これはステージング領域の原則の 1 つであり、場合によっては (ただし、そうではありません)、この種のサポート テーブルとビューをすべて格納するために専用の DB が必要になることがあります。

于 2013-05-08T08:38:04.090 に答える