【问题标题】:SQL Server - Maintain Referential Integrity without CASCADE and INSTEAD OF triggerSQL Server - 在没有 CASCADE 和 INSTEAD OF 触发器的情况下保持参照完整性
【发布时间】:2012-02-20 16:12:17
【问题描述】:

我有一个与父表 (TableA) 有外键关系的表 (TableB)。

当我删除表 A 中的记录时,我想通过删除表 B 中所有引用表 A 中已删除记录的记录来保持引用完整性。

通常我会删除级联。但是,由于 SQL Server 中的表结构和针对多个级联路径的过度保护措施,这种特定关系是不可能的。

我也不能使用 INSTEAD OF 触发器,因为 TableA 本身具有 CASCADE 外键关系。

我正在考虑将TableA和TableB之间的关系更改为ON DELETE SET NULL,然后创建一个AFTER触发器来清理TableB中的NULL记录。

有没有更好的方法来处理这种情况?

【问题讨论】:

  • 您能否解释一下您所说的“由于表结构和针对多个级联路径的过度保护措施”是什么意思,并且可能包括您的表定义?
  • 我知道人们的直接想法是看设计,但我不认为这特别不合理,无论如何重组不是一种选择。所以我只是在寻找关于如何在不重新设计的情况下解决这个特定问题的建议。我认为这个答案总结了我对 SQL Server 保障cascading deletes causing multiple cascade paths 的情况和想法
  • 只是好奇,现实世界中的哪些限制会阻止您在子表上执行删除操作,然后在父表上执行删除操作,而这两者可能都包含在事务中?
  • 听起来你在这个级联问题上的复杂性很深。我真的建议重新设计您的表以利用内置的 SQL 功能。我只是不认为你会自制一个比平台内置更好的答案。
  • @PhilipKelley 这样做没有真正的限制,我已经考虑将其作为替代解决方案。但是,如果我可以让数据库在有人可能直接修改数据(不太可能但可能)的情况下强制执行 RI,那将是可取的。

标签: sql-server triggers cascade referential-integrity


【解决方案1】:

您能否更改阻止您将其添加为ON DELETE CASCADE 的其他约束?

能否添加DeleteMe 列,然后发出UPDATE A SET DeleteMe = 1,然后使用后触发器先删除表B 行,然后删除请求的表A 行?

您能否以某种方式拆分或合并表(即垂直地)以分离它们相互排斥的依赖关系?

【讨论】:

  • 1.我可以在其他地方打破级联路径。然而,这种关系将是我理想的地方,因为它是最不重要的。 2. 这可行,但我想我更喜欢类似的 SET NULL 解决方案。 3. 我认为这不会消除多级联路径。
  • 第 3 项取决于您如何拆分表以及对同一列的多个约束的确切性质。因此,鉴于您所说的,听起来您关于更新为 NULL 的想法会奏效。 +1 提出一个好问题。
猜你喜欢
  • 1970-01-01
  • 2012-04-30
  • 1970-01-01
  • 2019-07-30
  • 1970-01-01
  • 1970-01-01
  • 2011-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多