以下是我正在使用的数据库模型的简化版本:
域名的快速解释:
我目前在客户和商店之间的FK上有一个'ON DELETE CASCADE'。也就是说,删除商店时删除商店的顾客。我还在折扣类别和商店之间的FK上有一个“ON DELETE CASCADE”。也就是说,删除商店时会删除商店的折扣类别。
现在考虑商店所有者想要删除折扣类别的情况。我想在客户和折扣类别之间的FK上设置'ON DELETE SET NULL'。
如果我尝试在SqlServer中执行此操作,它会抱怨通常的“多级联路径”问题。
问题:是否有任何优雅的方法来重新构建此问题,以便在删除折扣类别时将客户从折扣类别中删除(即将FK设置为null),同时仍保留其他级联关系?假设我无法离开SqlServer。
答案 0 :(得分:1)
您可以通过INSTEAD OF DELETE触发器实现ON CASCADE DELETE,即使有多个级联路径也可以使用。
这是一个“模板”:
CREATE TRIGGER PARENT_TRIGGER ON PARENT_TABLE INSTEAD OF DELETE AS
BEGIN
SET NOCOUNT ON;
DELETE FROM CHILD_TABLE
WHERE EXISTS (
SELECT * FROM deleted
WHERE CHILD_TABLE.PK = deleted.PK
);
-- You can DELETE from other child table here, etc...
END
GO
请注意,您将无法混合声明性级联和触发器 - 您需要一直实现触发器。