0

这是我目前正在使用的数据库模型的简化版本:

商店和顾客的简单 DB 模型(鱼尾纹 DB 符号)

域的快速解释:

  • 每个商店可以有多个客户。每个客户实体引用单个应用程序用户帐户(即用户和商店之间的多对多关系)。
  • 每个商店都可以设置折扣类别(商店也可能没有设置)。
  • 在商店购物时,可以将客户添加到折扣类别以获得折扣。

我目前在客户和商店之间的 FK 上有一个“ON DELETE CASCADE”。即,商店的客户在商店被删除时被删除。我在折扣类别和商店之间的 FK 上也有一个“ON DELETE CASCADE”。即删除店铺时,删除店铺的折扣类别。

现在考虑店主想要删除折扣类别的情况。我想在客户和折扣类别之间的 FK 上设置一个“ON DELETE SET NULL”。

如果我尝试在 SqlServer 中执行此操作,它会抱怨通常的“多级联路径”问题。

问题:是否有任何优雅的方法来改造这个问题,以便在删除折扣类别时将客户从折扣类别中删除(即将 FK 设置为空),同时仍然保留我的其他级联关系?假设我无法离开 SqlServer。

4

1 回答 1

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

请注意,您将无法混合声明性级联和触发器 - 您需要一直实现触发器。

于 2013-07-16T15:16:43.160 回答