我们有一个通常具有这种结构的数据库:
Master Record Table
id (pk)
MasterRecordId <-- constrained to be unique
儿童/兄弟姐妹(第二代,如果你愿意):
Table1
( table1ID (pk),
MasterRecordID (fk))
Table2
( Table2ID(pk),
MasterRecordID (fk))
Grandkids(第3代):
Table3
( Table3ID (pk)
Table1ID (fk))
Table4
(Table4ID (pk)
Table1ID (fk))
Table5
(Table5ID (pk)
Table2ID (fk))
并非第二代的每张桌子都有孩子。应用程序中存在受限制的删除功能(您可以删除任何单个记录,但在许多情况下FK会阻止删除;删除功能会被删除,并且不会优雅地失败)。
我的任务是调查处理删除的最佳方法。为了清除从主人到大孩子的整个记录,后端是唯一的方法。这使得那些幸福的权力。但是,你知道,用户谎言,所以事实证明我们可能需要改变它(因此我不必担任偶尔的官方记录删除器,因为有某些类型的Gen 2记录用户删除频繁
Cascading Deletes是第一个选项,因为TPTB更喜欢这不需要在应用程序的新版本上工作。而且因为这是在特定会议结束时从我老板的嘴里突然出现的。我的第2代 - &gt;第3代级联工作正常(这涵盖了最常见的用例/故事/你有什么)。然后我更新了所有的Master - &gt; Gen 2外键在删除时级联。在希望这将允许删除主记录,并且所有其他孩子和大孩子都会使用它。不好;我收到一条违反第一位主人的错误消息 - &gt;当我尝试删除主记录时,Gen 2 FK出现。我经过双重检查; FK设置为在删除时级联。
对于超过1级表关系的级联删除,我不了解什么?我正在尽可能多地阅读(如时间允许的话),但我还没有发现能让我走出这个黑暗时代的知识。是级联错误的方法吗?
其次,我认为还有另外两个选项:
在应用中删除所有内容。不是首选,但如果它是唯一的选择,它是唯一的选择。我知道有人认为这是最好的选择,但TPTB对我的看法不同(虽然他们都疯了,但他们签了支票。)
通过触发处理删除?我不清楚外键会不会出现这种情况,但是对我来说这可能是一种选择。
嗯,还有:
答案 0 :(得分:0)
您要写入的所有T-SQL代码“手动”删除子项,孙子项等。人。可以加载到MasterRecord表的触发器中,但我认为这是一个可怕的解决方案,如果没有其他原因,它会严重模糊关键数据库功能。
我会在app中(或者,最好是在存储过程中)执行此操作。但是,如果这不是一个选项,那么是的,看起来你似乎陷入了触发器或级联删除(可能是两者的组合)。你能骗TPTB吗? “他们不知道什么不会伤害你”规则是否适用?
我从未做过级联删除,上帝愿意我永远不会。我期待着阅读别人的帖子来回答你的问题。
答案 1 :(得分:0)
所以,显然我的一个或多个关系确实有问题(在后端删除使它更清晰)。我提出了数据库的新副本并重新应用了我的脚本,现在一切正常。 MSDN的This article帮助我意识到这个问题必须是我的一个关系。并且总的来说很有帮助。
因此,我们将看到TPTB决定接下来要做什么。