如何从大型 ER 模型中选择数据子集?

jra*_*ara 5 sql-server-2008 database-design sql-server referential-integrity

我的数据库中有一个相当大的 ER 模型和大量数据。现在我想将这些数据的一个子集放入不同的数据库中以进行测试。问题是如何从所有表中获取一个子集,这样我就不会破坏参照完整性并从数据库中获取孤立的记录?我的意思是,如果我选择 100 条记录,例如从“产品”表中,我如何轻松地从引用的表(以及这些表被引用的表)中获取所有数据?是否有任何工具可用于此目的或仅使用纯 SQL?

Con*_*lls 5

不幸的是,没有一种千篇一律的方法来做到这一点。您必须从一些基本记录开始,编写连接它们的查询,然后重复。随着您深入查询,查询变得更加复杂,因为它们必须直接返回到根。

如果您有外键,那么您可以自动生成查询,因为连接将仅通过外键列进行。这并不像听起来那么难,但如果您采用这种方法,这里有一些提示:

  • 查询只会在其叶子上检索表的内容,因此生成它们相当简单。

  • 以将通过 bcp 加载的形式获取数据。作为奖励,您可以从系统元数据生成 bcp 控制文件。

  • 您可能可以非常安全地复制所有参考数据,无论如何,这些数据可能占您表的大部分。

  • 您可能必须从多个根开始,并且如果您缺少外键,您可能必须手动添加连接元数据。如果您与叶表的关系不是纯粹的层次结构,那么您可能必须手动编辑生成器的元数据。实际上,这意味着您可能希望从系统数据字典开始,然后为您的生成器构建一个配置文件来解决这个问题。

  • 如果选择标准涉及多个记录路径,您可能还需要为某些数据项添加自定义查询。

  • 生成或编写使用 bcp 以正确顺序将表加载到目标的脚本。

通过一些手动干预,自动化可能会让您完成 95% 的工作,并且脚本并不难编写。这不是 5 分钟的工作,但肯定是可能的。

您可以以编程方式生成 SSIS 包来执行加载,但我认为生成 bcp 控制文件可能更容易。另一种选择是仅构建脚本,以便它们将查询中的数据复制到另一个影子数据库中。然后可以将其备份/恢复到您想要的任何位置。

这不是一项微不足道的任务,但肯定不会超出人类的智慧。作为奖励,如果您可以配置脚本以便参数化起始键,那么您可以制作一个通用实用程序来复制应用程序数据库的子集。这对于推出测试环境非常有用。