3

我有一个使用软删除的简单模式(这就是它的设计方式并且无法更改)。有两个表参与架构:Company (id, is_deleted)其中当然是表的Employee (id, company_id, is_deleted)FK 。规则是:company_idCompany

  • 如果一个Companyis_deleted = true,那么所有Employee提到的那个公司都应该有is_deleted = true
  • 但是即使父母有,Employee也可能有。is_deleted = trueCompanyis_deleted = false

我的两个问题是 a) 如何执行这些约束?b)当a被软删除时,如何最简单地确保is_deleted = true级联。Company

我添加了标签 postgresql 和 sql server 因为这些是我最感兴趣的数据库。如果其他 rdbms:es 中还有其他解决方案,我也想听听它们。

4

1 回答 1

4

严格来说,像这样级联值的唯一方法是使用 ON UPDATE CASCADE。为此 “is_deleted”列必须是唯一约束的一部分。

仅此一点并不难。如果 company.id 是您的主键,那么这对列 {id, is_deleted} 也将是唯一的。该对列的唯一约束将允许您通过外键引用进行级联更新。

但这不适用于您的情况,因为您需要允许引用值与引用值不同

所以在你的情况下,我认为你有三个选择。

  • 触发器
  • 存储过程
  • 应用代码

在所有这些情况下,您需要注意权限(可能撤销删除权限)以及可以避免您的代码的情况。例如,dbms 命令行界面和 GUI 界面可用于绕过应用程序代码和存储过程中的限制,具体取决于权限。

于 2012-11-09T12:34:24.327 回答