4

我想为我的 SQL Server 2005 数据库中的多个实体实施“软删除”方案。我的意思是,如果没有违反参照完整性规则,我想从表中删除一行,否则我将在记录上设置一个标志以表示它已被删除。我希望强制执行此“软删除”模式的表必须将“无操作”应用为“插入/更新规范”。

如何检查我要运行的删除是否会违反外键约束?

我不想捕获异常 - 我想明确检查是否会违反规则。我也不想通过 SELECT 语句手动检查(维护噩梦)。我更喜欢 T-SQL 中的解决方案;但我正在使用实体框架,因此如果存在用于此任务的 API,则可以使用 API。

请注意,这里有一个类似的问题但提供的答案不符合我的要求。

4

2 回答 2

3

与 Ed Harper 的解决方案类似,我也建议您使用 INSTEAD OF DELETE TRIGGER 但是,我们的解决方案不同之处在于我建议您实际配置数据库以强制执行所需的完整性检查/规则。

这样,当您的触发器代码中的删除操作由于违反约束而无法成功完成时,您可以标记记录(“软删除”)而不是实际删除它。

或者,如果没有发生违规,删除操作将成功完成。

此实现确保 DBMS 处理管理数据库完整性的全部责任,这当然应该是所需的场景。

有道理?

于 2009-07-23T10:57:45.500 回答
1

您可以在目标表上使用INSTEAD OF DELETE触发器来运行 select 语句以检查 FK 违规,然后再执行删除,如果没有找到。这将使您能够封装数据库中的所有逻辑,尽管如果您有大量删除、大型数据集或许多外键,性能可能会成为问题。如果您认为这会带来不可接受的维护问题,则可以编写使用数据库元数据动态构建必要查询的通用代码,而不是手动编写所有代码。

另一个可能更简单的选项是对所有删除实施软删除,然后包括一个计划的维护任务,它将所有可以安全删除的软删除转换为硬删除。根据数据集的大小和删除的数量,不执行预定的硬删除可能是可以接受的。

编辑

John Sansom 的回答是触发器解决方案的更好实施。

于 2009-07-23T08:36:52.837 回答