Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 数据库版本控制&x2013;如何返回到以前的版本并保留数据?_Sql_Sql Server_Database_Version Control - Fatal编程技术网

Sql 数据库版本控制&x2013;如何返回到以前的版本并保留数据?

Sql 数据库版本控制&x2013;如何返回到以前的版本并保留数据?,sql,sql-server,database,version-control,Sql,Sql Server,Database,Version Control,形势 我正在开发一个web应用程序,它使用SQL server存储数千条记录。我们目前正在使用源代码管理软件来保存应用程序的每个版本。该应用程序有两个主要版本: 测试版本(我们正在实际开发的版本) 实时版本(当前在网站上的版本) 我们大约每个月都会发布一个新的“主要”实时版本,但在这段时间内,我们可能会在当前的实时版本上发现许多小错误。为了修复这些bug,我们返回到测试机器上当前运行的Live版本(我们使用共享数据库进行测试…)。复制错误,找到原因,修复它,然后我将补丁应用到错误版本,然后立

形势

我正在开发一个web应用程序,它使用SQL server存储数千条记录。我们目前正在使用源代码管理软件来保存应用程序的每个版本。该应用程序有两个主要版本:

  • 测试版本(我们正在实际开发的版本)
  • 实时版本(当前在网站上的版本)
我们大约每个月都会发布一个新的“主要”实时版本,但在这段时间内,我们可能会在当前的实时版本上发现许多小错误。为了修复这些bug,我们返回到测试机器上当前运行的Live版本(我们使用共享数据库进行测试…)。复制错误,找到原因,修复它,然后我将补丁应用到错误版本,然后立即推送live,并将错误修复合并到测试版本中。在每个“主要”版本之间的一个月内,我们可以发布很多小错误修复补丁

问题

目前的问题是,只有源代码受版本控制;数据库不受版本控制。这是一个问题的原因是,在开发下一个“主要”版本时,数据库中可能会发生许多与以前版本不兼容的更改。因此,即使我们可以返回到以前版本的代码,数据库也无法执行相同的操作,因此我们无法测试以前的版本,除非我们当时有数据库备份

显而易见的解决方案似乎是将数据库置于版本控制之下。虽然将数据库模式和静态数据置于版本控制之下并不是一个真正的问题(我想我会使用),但我很难看到如何处理用户输入的数据

问题

由于我需要在表中输入用户输入的数据以测试应用程序,我该如何处理用户输入的数据

  • 如何使用该数据库的数据转到数据库的早期版本 当时数据库里有什么
  • 我是否应该将用户输入的数据置于版本控制之下?例如,为我们发布的每个版本使用数据库的完整备份
  • 审核是否是保存用户输入数据更改历史记录的良好解决方案
  • 因为用户输入的数据只是一个测试版本,所以它值得麻烦吗?我们总是可以手动重新创建测试应用程序所需的所有数据,但仅仅测试一个小bug可能需要很多时间

  • 根据我的经验,我建议结合使用数据库备份和数据库升级脚本。对于主要版本,您应该保留生产或类似生产的数据的备份(根据合同,您可能有义务清除或更改包含客户姓名、地址、银行账号等的数据)。从这一点开始,您应该能够访问数据库的任何中间版本,因为您正在编写数据库升级脚本,并将它们保存在源代码管理系统中(您目前正在这样做,对吗?)

    出于实际原因,您应该至少有两个单独的QA环境:一个是数据库模式和应用程序与您的生产环境相匹配的环境,另一个是与正在开发的版本相匹配的环境


    虽然数据库备份很大,但您只需要保留一些最新的备份,除非您预期需要对一个已停用多年的版本进行事后错误分析。

    在SQL Server中,您可以从服务器分离数据库文件,并将其置于版本控制之下(如果您愿意)。它们可以在以后重新连接到同一台或另一台服务器

    程序如下:

  • 右键单击SSMS中的数据库并选择属性
  • 点击“文件”
  • 向右滚动并注意where的完整路径 文件位于
  • 关闭数据库属性
  • 右键单击数据库名称,然后单击任务/分离
  • 检查“断开连接”和“更新统计信息”
  • 单击“确定”
  • 将.MDF和.LDF文件从上面的位置复制到您需要的任何位置 想拯救他们吗
  • 右键单击“数据库”,然后单击“附加…”
  • 单击“添加”
  • 从上面提到的位置找到.MDF文件并选择它
  • 单击“确定”

  • 就这样。您有一个数据库副本,可以在以后重新附加。

    如果您试图避免为可能需要还原的每个历史版本保留备份,为什么不尝试将当前生产备份的还原副本降级到所需版本

    如果您使用的是VS数据库项目,那么您将有一个可以返回的版本历史记录。您可以使用VS Schema Compare将数据库项目的历史版本与恢复的生产数据库进行比较。如果没有数据移动更改(例如,表/列拆分/合并),那么它应该成功地降级您的数据和模式(否则您可能需要手动更正自动生成的脚本)。有些人会在升级脚本的同时维护降级脚本,以简化此过程,但这需要遵守规则

    完成后,如果希望再次返回到最新版本,可以在数据库上运行现有的升级过程,使其返回到最新版本。或者,恢复测试数据库的备份可能更简单


    如果您选择使用SQL源代码管理和SQL比较,这也是我推荐的方法。

    使用DB备份有什么问题吗?还有一些小问题:它们的文件大小很大。我需要将它们与我的代码的每个版本相关联,所以我应该将这些巨大的文件置于版本控制之下。对于测试,备份是可以的,但在现场,我不能在转到另一个版本时简单地擦除所有数据。如果有,我就走后路