【问题标题】:Merging multiple Access databases into SQL Server将多个 Access 数据库合并到 SQL Server
【发布时间】:2011-03-15 00:26:00
【问题描述】:

我们有一个程序,其中每个用户都有自己的 Access 数据库。我们希望将这些都合并到一个 SQL Server 数据库中。

问题在于,使用 SQL Server 导入/导出向导时,主键/外键没有得到更新。例如,如果一个用户有这个表:

1 苹果 2 香蕉

另一个用户有这个:

1个椰子 2 芝士汉堡

生成的表格如下所示:

1 苹果 2 香蕉 1个椰子 2 芝士汉堡

同样,任何通过主键 (2) 引用 Banana 的内容现在都引用了 Banana 和 Cheeseburger,这不会让素食主义者非常高兴。

除了编写一个非常长且复杂的导入脚本之外,还有什么方法可以在导入时自动更新主/外键引用?

【问题讨论】:

  • 可以用user id + current key作为主键吗?这只意味着对表格进行相当小的改动。
  • @Remou:如果可能的话,我想避免重复条目(并且必须编辑每个访问文件中的每个表)。
  • 消除重复项将是第 2 阶段。您不必编辑每个表,您可以在导入时分配一个 id。
  • @Remou:这仍然需要一个自定义脚本来在导入时分配一个 ID,更不用说需要向 1000 个查询添加额外的 WHERE 条件。
  • 更新是什么意思?用户 A, 1, Apple 是否与用户 B, 1, Apple 相同,甚至用户 B, 2, Apple - 如果下个月/周用户 B, 1, Apple 变成用户 B, 1, Red Apple 怎么办?

标签: sql-server ms-access import


【解决方案1】:

如果您需要将它们完全分隔,您必须为每个表分配某种分区列。您是否有理由需要您的 SQL Server 具有与 Access 相同的引用完整性?您只是导入到 SQL Server 以获取只读报告吗?在那种情况下,我不会理会 RI。查询都需要 partitionid/siteid/customerid。您可以通过使用需要 partitionid 的表值 UDF 包装表来强制执行单实体访问。对于不起作用的跨站点。

如果您只是加载到 SQL Server 进行报告,我也会考虑更改数据模型以支持报告(即维度模型有时比规范化模型更好),而不是担心事务处理。

我认为我们需要更多地了解基本目标。

【讨论】:

  • 是的,它是一个完整的应用程序 - 必须有比修改每个表、每个查询以及编写自定义脚本来加载每个数据库更好的方法。以前没有人需要合并两个数据库吗!?
  • @BlueRaja - 是的,这绝对不是微不足道的 - 这就是为什么通常多租户架构是原始要求的一部分。代码生成当然会有所帮助——我不会在数据库中手动做任何事情——可能我大约 60% 的代码是生成的,其中大约 30% 是生成和调整的。如果没有触发器和生成的视图,实际代码的手动部分会增加很多,但你明白了。
【解决方案2】:

需要更多的需求信息。

我的基本问题是“您需要保留原始记录密钥吗?”例如1:用户数据库A表T中的apple; 1:用户数据库B的表T中的椰子。假设表T在所有数据库实例中具有相同的结构。我可以假设您可能希望保留原始数据的原因:(a) 您可能需要参考原始数据(可能是以前报告的视觉对象),和/或 (b) 可能存在数据依赖性应用程序本身。

如果答案是“否”,那么您可能只对保留所有不同的数据值感兴趣。允许使用新键构建 SQL 表并约束 SQL 表字段以使其包含唯一数据。这种方法似乎保留了原始表结构(但不是原始键值或其“位置”),可能足以满足您的要求。

如果答案是“是”,我看不到创建索引的方法,该索引保留指向原始数据库的指针和在其表 T 中创建的键。这种方法似乎需要修改应用程序。

在这种情况下,最好的方法可能是将传入的数据拆分为两个表:一个用于标识数据库和原始键,另一个用于标识不同的数据值。例如:(数据库)表D有'A:1:a,''A:2:b,''B:1:c,''B:2:d,''B:15:a'等记录,''C:8:a'; (数据)表 T1 有诸如 'a:apple'、'b:banana'、'c:coconut'、'd:cheeseburger' 等记录,其中 'A' 描述原始数据库 'location',1 是原始值位置“A”和“a”是使表 D 和表 T1 中的记录相等的值。 (否则你在一个表中有很多冗余数据;例如 A:1:apple, B:15:apple, C:8:apple。)此外,T1 的结构类似于原始 T 并且似乎是在应用程序中更直接有用。

【讨论】:

    【解决方案3】:

    最终为此创建了一个SSIS 项目。 SSIS 是由 Microsoft(以及 SQL Server 附带的“Business Integration Studio”的一部分)制造的visual programming tool,专为解决这类问题而设计。

    【讨论】:

      【解决方案4】:

      为什么不让 Access 使用它的复制管理器来合并数据库呢?这将允许您在导入 SQL Server 之前识别冲突并解决它们。我相当有信心它将保留外键关系。如果我正确理解您的情况,并且数据库是具有不同数据的相同结构,您可以将组合数据库加载到应用程序并在移动到 SQL Server 之前验证数据。

      您使用的是哪个版本的 Access?这是 Access 2000 的链接。使用语言来调整搜索参数以适合您的版本。

      http://technet.microsoft.com/en-us/library/cc751054.aspx

      【讨论】:

      • 这里是一些关于 Access Replication Manager 的常见问题的链接:support.microsoft.com/kb/282977
      • 请解释如何使用 Jet Replication 来合并两个非复制 Jet 数据库中的数据。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多