0

我需要将 200'000 条记录从一个数据库 (oracle) 迁移到另一个 (SQL Server)。我将使用 SSIS(SQL Server 集成服务)管理迁移,并且我已经创建了包。

记录引用数据库中的文档(带有 HBLOB 字段)。它们需要相当长的时间来迁移,因此我在 SSIS 中引入了变量,以便每次只迁移一部分记录,方法是使用将变量作为边界的查询。通过这种方式,我可以在上线日期之前开始移动一些历史记录。

一开始我想按 ID 移动,例如以 1'000 的第一个块然后是第二个块,依此类推。但这是不可能的,因为某些文档(在生产系统中)仍然可以更改,因此它们还不能移动。

这里有约束:

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])
--------------------------------------

现在,假设 (*) 行从打开更改为关闭,您需要先将此行迁移到您的目标数据库,然后检查您的迁移:

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

您可以通过任何方式改进您的查询,可能使用 JOIN 或 EXCEPT(我更喜欢第二种方式),但这是仅获取 (*) 行的最简单方法。然后在迁移后将 DocID 插入迁移表。这是暂存区的原则之一,有时(但事实并非如此)您需要一个专用数据库来存储所有此类支持表和视图。

于 2013-05-08T08:38:04.090 回答