且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

同一张表的2个外键可能会导致循环或多个级联路径

更新时间:2023-02-03 07:49:49

您可以在 INSTEAD OF 触发器中进行处理,因此当您尝试从 dbo.People 中删除时>,您可以先在 dbo.FamilyRelation 上执行必要的删除操作,以避免出现任何完整性错误:

You can handle this in an INSTEAD OF trigger, so when you try and delete from dbo.People, you can perform the necessary delete on dbo.FamilyRelation first to avoid any integrity errors:

CREATE TRIGGER dbo.People_Delete ON dbo.People
INSTEAD OF DELETE
AS
BEGIN

    -- PERFORM THE DELETES ON FAMILY RELATIVE
    DELETE  dbo.FamilyRelative
    FROM    dbo.FamilyRelative fr
            INNER JOIN deleted d
                ON d.ID IN (fr.PersonID, fr.FamiliarID);

    -- PERFORM THE DELETES ON PEOPLE
    DELETE  dbo.People
    WHERE   ID IN (SELECT d.ID FROM deleted d);

END
GO

关于SQL Fiddle的示例

Example on SQL Fiddle

我不知道您将如何处理 ON UPDATE CASCADE ,因为当您更新主键时,您将丢失触发器中已插入和已删除表之间的链接.

I don't know how you would handle ON UPDATE CASCADE since when you update the primary key you lose the link between the inserted and deleted tables within your trigger.