使用SSIS迁移和规范化数据库

时间:2009-03-13 13:09:58

标签: sql-server ms-access ssis data-migration

我们有一个MS Access数据库,我们想要使用新的数据库设计迁移到SQL Server数据库。已经编写了使用SQL Server DB的应用程序的一部分。

我环顾四周,了解如何最轻松地完成迁移步骤,并从微软SQL Server集成服务(SSIS)开始。现在我已经说到了我想垂直拆分表格以便归一化。

一个组成的例子看起来像这样

MS Access表

ID
Name
Street

SQL Server表

id
name

SQL Server表地址

id
person_id
street

如何使用SSIS完成此任务? id列是identity(autoincrement)列,因此我无法插入旧ID。如何将正确的person_id外键放在地址表中?

甚至可能有一个表必须分成三个表,其中table2中的一行属于table1,而table3中的一行属于一个行table2。

SSIS是否适合这种方式?

修改 虽然这是一次性迁移,但我们需要一个自动化且可重复的流程,因为生产数据库的使用率很高,我们正在开发环境中使用最新但不是最新的数据进行迁移。我们计划进行一次迁移测试,让客户检查行为。 如果一切正常,我们将进行真正的迁移。

大多数给定的解决方案包括许多手动步骤,因此不合适。

5 个答案:

答案 0 :(得分:3)

使用execute SQL Task并自行编写语句。

对于父表,执行Select into table from table...,然后在进展时对其余表执行相同的操作。确保为父表将身份插入设置为ON并重用旧ID。这将有助于您保持数据的完整性。

答案 1 :(得分:3)

要将Access表迁移到SQL Server,请使用SSMA, not the Upsizing Wizard from Access 您可以随意使用更多工具。

然后,您可以在SQL Server中逐个拆分表 我不确定是否有任何工具可以帮助您自动拆分表,至少我找不到任何工具,但手动操作并不困难,尽管需要多少工作取决于您如何使用原始表在你的VBA代码和表格中首先。

附注

关于规范化,不要过分夸大它:我知道你的例子就是这样,但是规范化的客户地址并不总是(很少?)。

一个人可以拥有多少个地址? 如果算上家庭住址,公司地址,送货地址,账单地址,这可能是您所需要的最多 在这种情况下,最好将它们保存在同一个表中。规范化数据只需要更多的工作来重新组合,并且没有任何好处 当然,在某些情况下,规范化是有意义的,但我看到人们对这个概念过分夸大(我也对此感到内疚)然后发现自己正在努力构建更复杂的查询以加入所有分裂数据,使开发和维护更加困难,并且在此过程中经常遭受性能损失。

答案 2 :(得分:1)

访问是如此用户友好,为什么不在Access中规范化表格,然后从那里升级完成的结构?

答案 3 :(得分:0)

我找到了一个尚未提及的不同解决方案,并允许我们使用数据流任务的所有舒适性和选项:

如果目标数据库位于本地 SQL Server上,则可以使用具有SQL Server目标的数据流任务而不是OLE DB目标。 对于SQL Server目标,您可以标记“保留标识”选项。 (我不知道英文名称是否正确,因为我们有德文版。)有了这个,你可以写入标识栏

我们发现我们无法在任何地方使用旧的主键,因为我们有一些表从多个表中获取记录的联合。

我们通过使用列

构建临时映射表来启动该过程
new_id (identity)
old_id (int)
old_tablename (string)

我们首先为新架构中的外键引用的每个表填写所有old_id。 new_id值由SQL Server自动生成。

因此,我们可以使用连接在需要时从old_id转换为new_id。我们使用new_id值来填充新表中的标识(主键)列,并使用“保持标识”选项,并且可以通过连接在我们的映射表中查找外键。

答案 4 :(得分:0)

您还可以查看Jamie ThomsonSSIS Normalizer组件。我今天刚刚发现它(还没有真正尝试过)。他发布的示例看起来很像你问题中的那个。