Sql server 使用SSI迁移和规范化数据库
我们有一个MS Access数据库,我们想用新的数据库设计将其迁移到SQL Server数据库。已编写使用SQL Server DB的应用程序的一部分 我环顾四周,了解如何最容易地完成迁移步骤,并从MicrosoftsSQLServerIntegrationServices(SSIS)开始。现在,出于规范化的原因,我想垂直拆分一个表 虚构的示例如下所示 MS访问表个人Sql server 使用SSI迁移和规范化数据库,sql-server,ms-access,ssis,data-migration,Sql Server,Ms Access,Ssis,Data Migration,我们有一个MS Access数据库,我们想用新的数据库设计将其迁移到SQL Server数据库。已编写使用SQL Server DB的应用程序的一部分 我环顾四周,了解如何最容易地完成迁移步骤,并从MicrosoftsSQLServerIntegrationServices(SSIS)开始。现在,出于规范化的原因,我想垂直拆分一个表 虚构的示例如下所示 MS访问表个人 ID Name Street id name SQL Server表person ID Name Street id na
ID
Name
Street
id
name
SQL Server表person
ID
Name
Street
id
name
SQL Server表地址
id
person_id
street
如何使用SSIS最好地完成此任务?id列是标识(自动增量)列,因此无法插入旧id。如何将正确的person_id外键放入地址表中
甚至可能有一个表必须分成三个表,其中表2中的一行属于表1,表3中的一行属于表2
SSIS是实现这一目标的适当手段吗
编辑
虽然这是一次性迁移,但我们需要一个自动化的、可重复的过程,因为生产数据库正在大量使用,我们正在开发环境中使用最新但不是最新的数据进行迁移。我们计划进行一次迁移测试运行,并让客户检查迁移行为。如果一切顺利,我们将进行真正的迁移
大多数给定的解决方案都包含大量手动步骤,因此并不合适。使用执行SQL任务并自己编写语句
对于父表,请执行
从表中选择into table…
,然后在进行其他操作时执行相同的操作。确保将父表的identity insert设置为ON,并重用旧ID。这将帮助您保持数据完整性。要将Access表迁移到SQL Server,请使用。你会得到更多的工具供你使用 然后,您可以从SQL Server中逐个拆分表。
我不确定是否有任何工具可以帮助您自动拆分表,至少我找不到任何工具,但手动拆分并不太困难,尽管所需的工作量取决于您最初在VBA代码和表单中使用原始表的方式 旁注 关于规范化,不要过火:我知道你的例子就是这样,但是规范化客户地址并不总是(很少?)需要的 一个人可以有多少个地址?
如果你算上家庭地址、业务地址、送货地址、账单地址,这可能是你所需要的最多的地址。
在这种情况下,最好把它们放在同一张桌子上。规范化这些数据只需要进行更多的工作来重新组合,不会带来任何好处。
当然,在某些情况下,正常化是有意义的,但我看到人们对这一概念太过火了(我也为此感到内疚),然后发现自己在努力构建更复杂的查询来连接所有分割的数据,使开发和维护变得更加困难,并且在这一过程中往往会受到性能的影响。Access对用户非常友好,为什么不在Access中规范化您的表呢,然后从那里升迁完成的结构?我发现了一个不同的解决方案,它还没有提到,允许我们使用数据流任务的所有舒适性和选项: 如果目标数据库位于本地SQL Server上,则可以将数据流任务与SQL Server目标一起使用,而不是使用OLE DB目标。 对于SQL Server目标,可以标记“保留标识”选项。(我不知道英文名字是否正确,因为我们有德文版本。)有了这个,你可以写进身份栏 我们发现我们不能到处使用旧的主键,因为有些表从多个表中获取记录的并集 我们首先构建一个带有列的临时映射表
new_id (identity)
old_id (int)
old_tablename (string)
我们首先为新模式中外键引用的每个表填充所有旧的_id。新的_id值由SQL Server自动生成
因此,我们可以在需要时使用连接将旧的\u id转换为新的\u id。我们使用新的id值用“保留标识”选项填充新表中的标识(主键)列,只需通过联接在外键的映射表中查找它们。您还可以查看的组件。我今天才发现(实际上还没有试过)。他发布的示例与您问题中的示例非常相似。这是个好主意,但如果我没有弄错,我需要先将Access DB导入SQL Server!?SQL任务没有源和目标连接。是的-很多情况下,最好先导入原始表,然后在SQL Server True中执行所有操作,因此首先导入access db,但是,将所有表名设置为其他名称,以便在分割数据后可以删除它们。旁注是正确的,我知道这一点。关于地址,情况正好相反。我们有五个不同的实体,它们都有地址,都存储在entities表中。我们希望统一这一点,并允许在实体之间轻松复制地址。我刚才看到,我虚构的示例表明,我们希望为一个人提供多个地址,而不是为多个实体提供一些地址。但正如你所说。我们希望有一个可重复/自动化的迁移过程。我不知道如何在Access中做到这一点。Access恰巧有一种相当灵活的编程语言,可以让您做任何需要的事情。当然,您可能有一些不同的语言,使您更容易在其他数据库中实现自动化。