我们正在将我们的数据库迁移到新模式,但想要验证数据是否已正确移动。
如果模式相同,传统的数据比较工具可以比较两个数据库的差异。在我们的例子中,表设计发生了变化,但旧模式中的所有数据都在新模式中,只是稍微移动了一下,我需要确保它是正确的。我们有数千万行,因此手动检查不是一种选择。
是否有任何工具可以帮助进行此类比较?
如果没有,是否有任何库/框架可以帮助启动自定义解决方案的开发?
如有必要,我很乐意使用特定于数据库的解决方案,在这种情况下用于 SQL Server 2008。
我的解决方案:我通过VIEW
在旧数据库上创建一个与新数据库表具有相同字段的每个表来比较两个数据集。
然后,我使用此处描述的技术比较数据:在 SQL Server 中比较两个表的最短、最快和最简单的方法:UNION!
我在这次迁移中很幸运,因为整体表结构类似于旧数据库,字段从一个表移动到另一个表,删除或添加。在删除和添加的情况下,没有什么可比较的,对于已移动或聚合的字段,我会在视图中进行计算以提供正确的信息进行比较。
该UNION
比较显示我只能用不同的行,所以只要数据是正确的,我得到一个空的结果集。
我有一个数据流可以将数据从旧数据库迁移到新数据库。旧设计将所有数据和历史信息(更改)存储在单个表中,并针对该行使用“版本”(递增整数)。
新设计有两个表,一个用于数据的“当前”状态和一个使用触发器记录更改的审计(或历史)表。因此,“当前”数据仅存在一行,并且有许多历史记录行。
在我的 SSIS 包中,我使用以下组件将当前数据复制到一个表,然后将所有数据发送到审计表。
多播用于拆分数据流,条件拆分标识“当前”行并将其发送到 Order 表(在任何人评论使用保留字作为表名之前,该表实际上并不称为Order)。
我创建了这个流,因为我看不到使用条件拆分将所有数据发送到审核目标的方法,而仅将当前行发送到另一个。
我假设创建所有重复数据然后将其丢弃到垃圾箱目标不是很有效,因为我有大约 5200 万行要迁移,我担心转换需要几天时间。
有没有更好(更有效)的方法来实现数据拆分?
关于数据的注意事项:我已将 a 应用于row_number()
数据,这使我可以将“当前”行标识为编号 1,包括“当前”在内的所有行都需要转到审计表目标。
编辑: 我找到了 SSIS Junkie 的这篇博文建议的 Multicast 和 Conditional Split 的替代方案: Multicast and Conditional Split: Multiple output from a synchronous script transform
它使用脚本组件将数据发送到一个或多个输出。我正在尝试这种方法,看看它是否更快,但在看到 Kenneth 的回答和关于删除垃圾目标的建议后,我不确定它会是这样。