0

我在为这种可预见的情况制定解决方案时遇到了一些麻烦。

TableA 对 TableB 有一个 FK。TableC 对 TableA 有一个 FK。TableC 对 TableD 有一个 FK。

TableA
------
taId
tbId

TableB
------
tbId

TableC
------
tcId
taId
tdId

TableD
------
tdId

一系列简短的事件:

  • 1) 对表 B 中的记录发出级联软删除。这会导致 TableA 中的所有相关记录都被软删除,级联到 TableC 中的所有相关记录都被软删除。
  • 2) 稍后,TableD 中的一条记录被软删除,再次级联。表 D 中的该记录在表 C 中作为 FK 保存。但是,TableC 已被标记为软删除。
  • 3) 请求恢复步骤1中TableB中的记录。

    如何确保在将相关记录还原到 TableB 中的已还原记录(即 TableA 和 TableC 中)时,我不会还原任何依赖于第 2 步 TableD 中的记录的内容——此外,在不还原部分的情况下它依赖于表 D 中的记录,我以级联方式限制恢复(即,如果发现 TableC 与软删除的记录有关系,则不恢复 TableA)?

    我考虑的是利用表格中的时间设计以及 GUID。每个表将具有(除了软删除标志)一个 DateDeleted 字段和一个 GUID 字段(其中相同的 GUID 将分配给级联软删除中的每个节点以区分级联集)。这将使恢复级联集变得非常容易,因为它们将共享日期和 GUID。但是我遇到的问题,也就是上面概述的问题,是如何处理软删除记录将从不同的级联中删除的情况。

  • 4

    1 回答 1

    2

    由于您的TableD记录是软删除的,因此您不必担心通过恢复您的第一个软级联删除来破坏参照完整性。但是,您的级联恢复逻辑需要做的是测试正在进行软恢复的每个表的其他依赖关系。

    如果有对本身已被软删除的父项的引用,那么您也需要对该父项进行软恢复。

    实现此目的的一个好方法是拥有一个按表软删除存储过程(或触发器)和一个按表软恢复存储过程(或触发器)。这些过程会将您的日期/GUID(软删除业务交易 ID)作为输入参数。

    对于每个表,相关的 proc 将知道依赖项是什么。软删除具有下游级联依赖性,软恢复将具有上游级联依赖性。每个 proc 将其自己的表记录标记为已删除或已恢复,然后调用执行级联操作所需的 procs。

    于 2012-04-11T19:22:40.843 回答