您好亲爱的Stack Overflow社区,
我已经搜索了好几个小时,但我找不到解决方案,这是我非常独特的情况 也许你们可以帮忙。
我们假设我们有two tables。
|domain_realm | | password_policy |
|-------------------------------- | | ---------------------------------------|
|id domain password_policy_id | | id min_chars min_numbers min_length |
|1 1 11 | | 11 3 2 |
|2 1 12 | | 12 4 1 |
一个称为domain_realm
,另一个称为password_policy
。
这是OneToOne关系,因此一个domain_realm
只有一个password_policy
。
现在出现了这种场景中非常独特的案例:
domain_realm
持有password_policy_id
(或多或少fk),而不是password_policy
持有其父级的外键。
为什么有人这样做?
我们假设password_policy
是许多其他不使用域领域的应用程序的一部分。因此,保持表清除任何其他应用程序所需的任何特定行都是必需的(例如fk_domain_relam
)。
现在,删除ON DELETE CASCADE
时似乎无法自动删除(password_policy
)相关domain_realm
。
有没有办法以SQL的方式执行此操作,还是必须知道这一点,并确保在我的代码中删除password_policy
?
这将是非常讨厌的,因为如果我必须直接在数据库中删除domain_realm
(调试或支持原因)我已经创建了一个孤儿,我必须知道这一点。否则,孤儿将永远留在那个数据库中。
非常感谢你,甚至读这篇文章。
答案 0 :(得分:0)
您可以在从domain_realm删除后创建触发器。我对postgresql中的语法不是100%肯定,但看起来应该是这样的:
CREATE OR REPLACE FUNCTION update_policy() RETURNS TRIGGER AS $$
BEGIN
DELETE FROM password_policy WHERE password_policy_id = OLD.password_policy_id;
IF NOT FOUND THEN RETURN NULL; END IF;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER clean_policy
AFTER DELETE ON domain_realm
FOR EACH ROW EXECUTE PROCEDURE update_policy();