【问题标题】:Use SSIS to migrate and normalize database使用 SSIS 迁移和规范化数据库
【发布时间】:2009-03-13 13:09:57
【问题描述】:

我们有一个 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 是否适合这种情况?

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 这是个好主意,但如果我做对了,我需要先将Access DB导入SQL Server!? SQL 任务没有源和目标连接。
    • 是的 - 很多时候最好先导入原始表,然后在 SQL Server 中进行所有操作
    • true,所以首先导入访问数据库,但将所有表名设置为其他名称,以便在拆分数据后可以将其删除。
    【解决方案2】:

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

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

    附注

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

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

    【讨论】:

    • 旁注是真实的,我知道这一点。关于地址,情况正好相反。我们有五个不同的实体,它们都有地址,都存储在实体表中。我们希望统一这一点并允许在实体之间轻松复制地址。
    • 我刚刚看到,我虚构的示例表明我们希望为一个人提供多个地址,而不是为多个实体提供一些地址。但正如你所说。这个例子就是这样。
    【解决方案3】:

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

    【讨论】:

    • 我们希望有一个可重复/自动化的迁移过程。我看不到如何在 Access 中执行此操作。
    • Access 恰好有一种相当灵活的编程语言,它应该允许您做任何您需要的事情。当然,您可能有一些不同的语言可以让您更轻松地在其他数据库中实现自动化。
    【解决方案4】:

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

    如果目标数据库位于 本地 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 值通过“保留身份”选项填充新表中的身份(主键)列,并且可以通过连接在我们的映射表中查找外键。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-30
        • 1970-01-01
        • 1970-01-01
        • 2017-01-23
        • 1970-01-01
        • 2021-10-27
        • 2012-10-08
        相关资源
        最近更新 更多