Sql server 使用SSI迁移和规范化数据库

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

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

我环顾四周,了解如何最容易地完成迁移步骤,并从MicrosoftsSQLServerIntegrationServices(SSIS)开始。现在,出于规范化的原因,我想垂直拆分一个表

虚构的示例如下所示

MS访问表个人

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恰巧有一种相当灵活的编程语言,可以让您做任何需要的事情。当然,您可能有一些不同的语言,使您更容易在其他数据库中实现自动化。