Database 源代码控制的数据库数据导入策略

Database 源代码控制的数据库数据导入策略,database,version-control,Database,Version Control,所以我得到了一个项目,让db团队为db进行源代码控制(奇怪吧?)无论如何,db已经存在,它是巨大的,并且应用程序非常依赖于数据。开发人员在编写存储过程等时,最多需要三种不同风格的数据 显然,我可以编写数据插入脚本 但我的问题是,您使用什么工具或策略从源代码管理构建数据库,并用多个大型数据集填充它?很高兴看到您将数据库置于源代码管理之下 我们在源代码管理中有数据库对象,但没有数据(除了一些查找值)。为了维护dev上的数据,我们通过恢复最新的prod备份来刷新数据,然后为任何数据库更改重新运行脚本。

所以我得到了一个项目,让db团队为db进行源代码控制(奇怪吧?)无论如何,db已经存在,它是巨大的,并且应用程序非常依赖于数据。开发人员在编写存储过程等时,最多需要三种不同风格的数据

显然,我可以编写数据插入脚本


但我的问题是,您使用什么工具或策略从源代码管理构建数据库,并用多个大型数据集填充它?

很高兴看到您将数据库置于源代码管理之下

我们在源代码管理中有数据库对象,但没有数据(除了一些查找值)。为了维护dev上的数据,我们通过恢复最新的prod备份来刷新数据,然后为任何数据库更改重新运行脚本。如果我们所做的工作需要特殊的数据(比如新的查找值,这些值不在prod或test登录上),那么我们也有一个脚本,它是源代码管理的一部分,并且将同时运行。不过,您不希望编写所有数据的脚本,因为通过脚本重新创建1000万条记录会非常耗时(如果您有1000万条记录,那么您肯定不希望开发人员针对一个包含10条测试记录的数据库进行开发!)。恢复prod数据的速度要快得多


因为我们所有的部署都是通过源代码控制的脚本完成的,所以我们在让人们编写他们需要的脚本方面没有问题。希望你也不会。当我们第一次启动时(以及当dev可以自己部署prod时),我们实际上必须经过几次,删除任何不在源代码管理中的对象。我们很快就学会了将所有db对象置于源代码管理中

通常,我们只将
.sql
文件放在源代码管理中,用于(重新)构建模式

然后,我们将能够读取生产或集成数据库的脚本放入源代码控制中,以便在数据库中提取和填充先前执行的
.sql
产生的相关数据集


其思想是使用足够健壮的脚本获取最新数据,以便从数据库中读取数据,而数据库的版本并不总是与正在构建的版本相同。(但在现实中,差异从来没有那么大,数据也很容易读取)

看看VisualStudioTeamSystem,数据库版——2008版和GDR2下载版,或者2010版。它可以处理完全集成到源代码管理中的模式版本控制,并可以处理测试数据生成(如随机名称等)

我个人喜欢它-我使用ManagementStudio进行点开发,然后启动VisualStudio并将更改同步到项目中,然后从那里将更改同步到生产中

我用它来发展自己。我没有编写生产数据的脚本——我的maiin数据库现在大约有300gb,我有一个接近5亿行的表。我有一个开发服务器,有时需要时会加载数据的副本。开发人员使用smalltest数据或dev服务器(这里的人不多)


初始数据由存储过程或特殊上载/验证脚本维护,这些脚本作为过程的一部分运行,并检查查找表等元素。

我过去使用过几种策略,但下面是一种有效的策略:

  • 创建DDL(数据库创建)脚本并将其签入源代码管理
  • 为每个配置创建一个单独的数据填充脚本(或一组脚本)
  • 设置自动构建以为每个配置创建单独的部署包,其中将包括适当的脚本
如果您正在处理的系统正在生产中,并且具有无法清除的数据:

  • 创建一组单独的“升级/补丁”脚本,用于更新架构(为部署目标上已经存在的对象更改表、创建或替换过程等)
  • 如果需要,为每个构建需要填充的任何数据创建“插入”脚本;这些应该是“可重新运行的”(如果补丁部署两次,则不会弄乱数据)

对于包含配置类型数据(非事务性)的表,我们使用Excel。我们在电子表格中插入一个VBA脚本来处理save事件,并让它在保存时吐出sql insert语句。业务分析师和客户喜欢Excel,因此这种技术非常适合他们,可以为我们提供预定义的场景供我们测试。我们通常对output.sql文件进行源代码控制,以便使用它加载自动生成的数据,Excel文件放在Team SharePoint网站中。

这最好作为两个单独的主题处理。一方面,您需要一个可靠且一致的数据库模式(表、索引、VIE、过程、函数,以及查找值和系统所需的任何不变的“静态”数据),并且您需要对其进行版本控制,以便跟踪随时间(以及由谁)发生的更改并且还可以控制更改何时应用于哪个数据库实例。之前关于这个问题的文章已经很好地涵盖了这个主题

另一方面,您需要用数据填充数据库,以便测试和开发新代码。定义和加载此类数据与定义和加载将保存它的结构不同。虽然通过源代码管理来管理数据库定义是一个容易解决的问题,但在过去的许多年中,我从未听说过解决数据问题的同样简单(嗯,相对简单)的解决方案。问题的各个方面包括:

  • 确保有足够的数据。每个表添加10-20行很容易,但如果实时数据库包含数百万行或更多行,则无法预测性能

  • 一个快速而简单的解决方案是获取最新生产数据库的副本,并使用最新的更改进行更新