具有多个级联路径的数据库模型问题和'on delete set null'

时间:2013-07-15 16:07:25

标签: sql-server database database-design cascade

以下是我正在使用的数据库模型的简化版本:

Simple DB model of stores and customers (crow's foot DB notation)

域名的快速解释:

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

我目前在客户和商店之间的FK上有一个'ON DELETE CASCADE'。也就是说,删除商店时删除商店的顾客。我还在折扣类别和商店之间的FK上有一个“ON DELETE CASCADE”。也就是说,删除商店时会删除商店的折扣类别。

现在考虑商店所有者想要删除折扣类别的情况。我想在客户和折扣类别之间的FK上设置'ON DELETE SET NULL'。

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

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

1 个答案:

答案 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

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