首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建应用程序数据快照-最佳实践

创建应用程序数据快照-最佳实践
EN

Stack Overflow用户
提问于 2011-12-12 08:20:23
回答 2查看 1.6K关注 0票数 2

我们有一个在C#中使用.NET FW4.0开发的文本处理应用程序,其中管理员可以定义各种设置。所有这些“设置”数据都驻留在大约50个具有外键关系和标识主键的表中(我认为这将使其变得棘手)。整个数据库不超过100 K记录,平均表大约有6列。该系统基于MS 2008 R2速递数据库。

我们需要创建所有这些数据的快照,以便系统管理员可以在任何时候出错时回滚到快照中。我们只需要保存最后5张快照。快照的创建必须从应用程序GUI开始,如果需要,也必须回滚到任何快照(如果拒绝直接访问DB,将不允许使用SSMS )。这个系统还在开发中(我们真的完成了吗?)这意味着要多次添加新的表和列。因此,我们需要一个能够自动处理更改的健壮方法(在插入/更改列之后挖掘代码是我们希望避免的事情,除非没有其他方法)。最好的方法是告诉您“我想要创建名称以‘Admin’开头的所有表的快照”。显然,这是一个数据库密集型的任务,但由于它只用于紧急情况,这是我不介意的。我也不介意表锁是否会发生,因为在快照的创建或回滚过程中,什么都不会尝试使用这些表。

该问题可分为两部分:

  1. 创建快照
  2. 回滚到快照

关于问题1,我们可能有两个选择:

  1. 将数据导出到XML (文件或数据库列)
  2. 将SQL中的数据复制到相同或不同的表中(例如再次创建相同的表结构,其名称与以“备份”为前缀的原始表的名称相同)。

关于问题2,我看到的最大问题是如何将所有数据重新导入到使用标识列进行PK生成的外键相关表中。我需要从所有受影响的表中删除所有数据,然后重新导入所有数据,同时暂时放松FK限制并关闭标识生成。一旦加载了数据,我应该检查FK约束是否仍然正常。

或者,我应该找到一种逻辑的方法来加载表,以便在加载时保持约束检查的位置(因为我们没有无法管理的表数,这可能是一个可行的解决方案)。当然,出于显而易见的原因,我需要在单个事务中执行所有删除和重新加载操作。

我怀疑这方面可能没有纯基于SQL的解决方案,尽管SQL可能有助于避免将数据从Server中移出。

有没有人和我们面临同样的问题?也许是成功解决了这个问题的人?

我不期望一步一步的指示。任何关于从哪里开始、选择哪条路线(导出到原始XML或将快照保存在DB中或两者都保存)的帮助,都会非常有帮助。

谢谢你的帮助和时间。

丹尼尔

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-12 08:51:10

按日期范围进行版本控制是企业应用程序中记录的一种常见方法。例如,我们有一个商业实体(我们)或公司(英国)的表,我们将当前的官方名称保存在另一个表格中,如下所示:

代码语言:javascript
复制
CompanyID    Name            ValidFrom     ValidTo
12           Business Lld    2000-01-01    2008-09-23
12           Business Inc    2008-09-23    NULL

最后一个记录中的null表示这是当前记录。您可以使用上述逻辑,并可能添加更多列以获得更多的控制。这样就不存在重复项,您可以将历史记录保持到任何级别,并轻松地跨表同步当前值。最后表演会很精彩的。

票数 1
EN

Stack Overflow用户

发布于 2011-12-12 09:09:11

我们没有这个确切的问题,但我们有一个非常类似的问题,我们为客户提供了一组基本的配置数据(相当复杂,主要是标识PKs),在提供新版本时需要更新这些数据。

对于您的情况,我们的机制可能有些过分,但我相信其中有一个子集是适用的。

基本办法是:

首先,我们执行一个脚本,它删除所有的FK约束,并将当前非空的那些FK列的空性更改为NULL。此脚本还删除所有触发器,以确保在其中实现的任何逻辑约束都不会被执行。

接下来,我们执行数据导入,在更新表之前将identity_insert设置为off,然后在更新表中的数据后将其重新设置。

接下来,我们执行一个脚本来检查新添加的项与外键有关的数据完整性。在我们的示例中,我们知道没有相应父记录的项可以安全地删除,但是您可以选择采用不同的方法(报告错误并让某人手动处理问题)。

最后,一旦我们验证了数据,我们就执行另一个脚本来恢复空性,添加FKs返回,并恢复触发器。

如果您有它的预算,我强烈建议您查看一下红门提供的工具,特别是suspect和SQL比较(我怀疑可能还有其他工具,我们只是没有使用它们的任何经验)。这些工具对成功执行我们的战略至关重要。

更新

我们通过RedGate的SQL生成的SQL脚本提供基线配置。

因为我们的最终用户可以在更新之间修改数据库,这将导致他们数据库中的标识值在我们的数据库中不同,因此我们实际上将基线主键和外键存储在每个记录中的单独字段中。

当我们更新客户数据库并需要将新记录链接到已知的配置信息时,我们可以使用基线字段来查找特定于数据库的FKs应该是什么。

换句话说,无论数据库中修改了哪些其他数据,都有一组已知的配置记录字段In,我们可以使用它将记录链接到一起。

例如,如果我有Table1链接到Table2,Table1将有一个基线PK,而Table2将有一个基线PK和一个包含表1的基线PK的基线FKey。当我们更新记录时,如果我们添加了一个新的Table2记录,我们所要做的就是找到带有指定基线PK的Table1记录,然后用Table1中的实际PK更新Table2中的实际FKey。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8471520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档