我们有一个在C#中使用.NET FW4.0开发的文本处理应用程序,其中管理员可以定义各种设置。所有这些“设置”数据都驻留在大约50个具有外键关系和标识主键的表中(我认为这将使其变得棘手)。整个数据库不超过100 K记录,平均表大约有6列。该系统基于MS 2008 R2速递数据库。
我们需要创建所有这些数据的快照,以便系统管理员可以在任何时候出错时回滚到快照中。我们只需要保存最后5张快照。快照的创建必须从应用程序GUI开始,如果需要,也必须回滚到任何快照(如果拒绝直接访问DB,将不允许使用SSMS )。这个系统还在开发中(我们真的完成了吗?)这意味着要多次添加新的表和列。因此,我们需要一个能够自动处理更改的健壮方法(在插入/更改列之后挖掘代码是我们希望避免的事情,除非没有其他方法)。最好的方法是告诉您“我想要创建名称以‘Admin’开头的所有表的快照”。显然,这是一个数据库密集型的任务,但由于它只用于紧急情况,这是我不介意的。我也不介意表锁是否会发生,因为在快照的创建或回滚过程中,什么都不会尝试使用这些表。
该问题可分为两部分:
关于问题1,我们可能有两个选择:
关于问题2,我看到的最大问题是如何将所有数据重新导入到使用标识列进行PK生成的外键相关表中。我需要从所有受影响的表中删除所有数据,然后重新导入所有数据,同时暂时放松FK限制并关闭标识生成。一旦加载了数据,我应该检查FK约束是否仍然正常。
或者,我应该找到一种逻辑的方法来加载表,以便在加载时保持约束检查的位置(因为我们没有无法管理的表数,这可能是一个可行的解决方案)。当然,出于显而易见的原因,我需要在单个事务中执行所有删除和重新加载操作。
我怀疑这方面可能没有纯基于SQL的解决方案,尽管SQL可能有助于避免将数据从Server中移出。
有没有人和我们面临同样的问题?也许是成功解决了这个问题的人?
我不期望一步一步的指示。任何关于从哪里开始、选择哪条路线(导出到原始XML或将快照保存在DB中或两者都保存)的帮助,都会非常有帮助。
谢谢你的帮助和时间。
丹尼尔
发布于 2011-12-12 08:51:10
按日期范围进行版本控制是企业应用程序中记录的一种常见方法。例如,我们有一个商业实体(我们)或公司(英国)的表,我们将当前的官方名称保存在另一个表格中,如下所示:
CompanyID Name ValidFrom ValidTo
12 Business Lld 2000-01-01 2008-09-23
12 Business Inc 2008-09-23 NULL最后一个记录中的null表示这是当前记录。您可以使用上述逻辑,并可能添加更多列以获得更多的控制。这样就不存在重复项,您可以将历史记录保持到任何级别,并轻松地跨表同步当前值。最后表演会很精彩的。
发布于 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。
https://stackoverflow.com/questions/8471520
复制相似问题