2011-12-12 42 views
2

我们在C#中使用.NET FW 4.0开发了一个文本处理应用程序,其中管理员可以定义各种设置。所有这些“设置”数据都存放在大约50张使用外键关系和主键身份的表格中(我认为这会让人感到棘手)。整个数据库不超过10万条记录,平均表约有6个短列。该系统基于MS SQL 2008 R2 Express数据库。创建应用程序数据的快照 - 最佳实践

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

问题可分为两个部分:

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

关于问题#1。我们可以有两种选择:

  1. 的数据导出到XML(文件或数据库列)
  2. 复制SQL里面的数据到相同或不同的表(如使用相同的名称重新创建相同的表结构原始表以“备份”为前缀)。

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

或者我应该找到一个加载表的逻辑方法,以便在加载时可以保持约束检查(因为我们没有难以管理的表的数量,这可能是一个可行的解决方案)。当然,我需要在一次交易中完成所有删除和重新加载,原因很明显。

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

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

我不期望一步一步的指示。从哪里开始,获取哪些路线(导出为RAW XML或在数据库中保存快照,或者两者兼而有之),优点/缺点的任何帮助都将非常有帮助。

谢谢你的帮助和你的时间。

Daniel

回答

1

一种按日期范围进行版本控制是企业应用程序中记录的常用方法。作为一个例子,我们有实体企业(美国)或公司(英国)的表和我们保持目前的正式名称在另一个表如下:

CompanyID Name   ValidFrom  ValidTo 
12   Business Lld 2000-01-01 2008-09-23 
12   Business Inc 2008-09-23 NULL 

在过去的记录中的null表示,这是目前的一个。你可以使用上面的逻辑并可能添加更多的列来获得更多的控制权。这样就没有重复,您可以将历史记录保存到任何级别,并轻松地跨表格同步当前值。最后,表现会很好。

+0

这是一个伟大的想法,类似于我正在寻找的。谢谢。 – Daniel

+0

永远是快乐 – 2011-12-12 14:16:05

2

我们没有这个确切的问题,但我们必须在我们为客户提供一套基准配置数据(相当复杂,主要是身份PKS)一个非常类似的问题,需要进行更新时,我们提供了一个新版本。

我们的机制可能是您的情况矫枉过正,但我​​相信有它的一个子集,它是适用的。

的基本方法是这样的:

首先,我们执行的是丢弃所有的FK约束和改变那些目前NOT NULL为NULL FK列的为空的脚本。该脚本还会删除所有触发器,以确保其中执行的任何逻辑约束都不会被执行。

接下来,我们进行数据导入,更新表,然后再在表中的数据被更新后,将其设置之前设置IDENTITY_INSERT关闭。

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

最后,一旦我们已经验证的数据,我们执行另一个脚本恢复为空性,增加了FKS回来,并重新安装触发器。

如果你有预算的话,我会强烈建议你看看那个Red Gate提供,特别是SQL包装程序和SQL数据比较(我怀疑可能还有其他的工具,在那里,以及工具,我们只是没有任何经验)。这些工具对于成功实施我们的战略至关重要。

更新

我们提供通过由展鹏的SQL包装程序生成的SQL脚本的基准配置。

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

当我们更新的客户数据库,我们需要新的记录链接到已知的配置信息,我们可以使用基线领域找出特定数据库的FKS应该是什么。

换句话说,对于众所周知的配置记录总是有一组已知的字段标识,而不管数据库中有哪些其他数据被修改,我们可以使用它来将记录链接在一起。例如,如果我将Table1链接到Table2,Table1将具有基准PK,而Table2将具有基准PK和包含Table1基准PK的基准FKey。当我们更新记录时,如果我们添加一个新的Table2记录,我们所要做的就是查找带有指定基准PK的Table1记录,然后用Table1中的实际PK更新Table2中的实际FKey。

+0

感谢您的彻底回复。你如何提供基准配置?作为一个SQL脚本,XML文件或数据库文件可能?我们有内置的RedGate软件,但通过创建“差异脚本”并在自动化逻辑无法应对差异的情况下手动进行编辑,可用于将数据库迁移到较新版本。他们是非常好的产品。但正如我所提到的,系统管理员不允许使用数据库管理工具。 – Daniel

+0

@Daniel:我已经用其他信息更新了答案。 –

+0

感谢您提供更新。我们可能会采用混合解决方案,将您的想法与drdigit提供的想法混合使用。 – Daniel