4

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

我四处寻找如何最轻松地完成迁移步骤,并从 Microsoft 的 SQL Server 集成服务 (SSIS) 开始。现在,出于规范化的原因,我想垂直拆分表格。

一个虚构的例子看起来像这样

MS Access 表

ID
Name
Street

SQL Server 表

id
name

SQL Server 表地址

id
person_id
street

如何使用 SSIS 最好地完成这项任务?id 列是标识(自动增量)列,因此我无法插入旧 ID。如何在地址表中放入正确的 person_id 外键?

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

SSIS 是合适的方法吗?

编辑 虽然这是一次性迁移,但我们需要一个自动化且可重复的过程,因为生产数据库的使用量很大,我们正在开发环境中使用最新但不是最新的数据进行迁移. 我们计划对迁移进行一次测试运行,并让客户审查行为。如果一切正常,我们将进行真正的迁移。

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

4

5 回答 5

3

使用执行 SQL 任务并自己编写语句。

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

于 2009-03-13T13:20:46.700 回答
3

要将 Access 表迁移到 SQL Server,请使用SSMA,而不是 Access 中的升迁向导
您将获得更多可用的工具。

然后,您可以从 SQL Server 中一张一张地分解您的表。
我不确定是否有任何工具可以帮助您自动拆分表格,至少我找不到任何工具,但是手动完成并不难,尽管需要多少工作取决于您使用原始表格的方式首先在您的 VBA 代码和表单中。

旁注

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

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

于 2009-03-14T02:29:55.180 回答
1

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

于 2009-03-14T22:46:08.807 回答
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 值通过“保留身份”选项填充新表中的身份(主键)列,并且可以通过连接在我们的映射表中简单地查找它们以获取外键。

于 2009-03-18T10:16:39.660 回答
0

您还可以查看Jamie ThomsonSSIS Normalizer组件。我今天才发现它(实际上还没有尝试过)。他发布的示例看起来很像您问题中的示例。

于 2009-04-27T23:44:25.743 回答