在删除记录之前检查规则违规

时间:2009-07-22 23:56:41

标签: sql-server database-design data-integrity

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

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

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

请注意,here提出了类似的问题,但所提供的答案不符合我的要求。

2 个答案:

答案 0 :(得分:3)

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

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

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

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

有意义吗?

答案 1 :(得分:1)

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

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

修改

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