none
FOREIGN KEYs mit ON DELETE CASCADE bringt Fehler 'Tabelle kann Schleifen oder mehrere Kaskadepfade verursachen' RRS feed

  • Frage

  • Hallo
    ich habe folgende Tabellen mit Feldern
    tbAuftrag  id_AU
    tbPosition id_PO, id_AU
    tbDocument id_DO, id_AU, id_PO
    Aufträge und Positionen sollen jeweils mehrere Dokumente haben können. Daher habe ich die die 2 FOREIGN KEYs mit ON DELETE CASCADE gesetzt:
     FOREIGN KEY = tbAuftrag.id_AU        REFERENCES = tbDocument.id_AU
     FOREIGN KEY = tbAuftrag.id_PO        REFERENCES = tbDocument.id_PO 
    Das funzt. Für alle Dokument von AU sind die id_PO=Null und für alle Positionsdokumente ist id_AU=Null.

    Jetzt sollen aber natürlich auch die Positionen eines Auftrage gelöscht werden, wenn ein Auftrag geslöscht wird. Also setze ich noch den FK:
     FOREIGN KEY = tbAuftrag.id_AU        REFERENCES = tbPosition.id_AU
    Aber dann kommt der Fehler 'Tabelle kann Schleifen oder mehrere Kaskadepfade verursachen'.
    In MSAccess ging das problemlos und logisch gesehen ist das in meinem Augen auch richtig (und notwendig).
    Wie kann man das Problem lösen?

    Vielen Dank
    Grüße von Torsten

     
    Freitag, 14. März 2014 09:06

Antworten

  • Hallo
    ich habe folgende Tabellen mit Feldern
    tbAuftrag  id_AU
    tbPosition id_PO, id_AU
    tbDocument id_DO, id_AU, id_PO
    Aufträge und Positionen sollen jeweils mehrere Dokumente haben können. Daher habe ich die die 2 FOREIGN KEYs mit ON DELETE CASCADE gesetzt:
     FOREIGN KEY = tbAuftrag.id_AU        REFERENCES = tbDocument.id_AU
     FOREIGN KEY = tbAuftrag.id_PO        REFERENCES = tbDocument.id_PO 
    Das funzt. Für alle Dokument von AU sind die id_PO=Null und für alle Positionsdokumente ist id_AU=Null.

    Jetzt sollen aber natürlich auch die Positionen eines Auftrage gelöscht werden, wenn ein Auftrag geslöscht wird. Also setze ich noch den FK:
     FOREIGN KEY = tbAuftrag.id_AU        REFERENCES = tbPosition.id_AU
    Aber dann kommt der Fehler 'Tabelle kann Schleifen oder mehrere Kaskadepfade verursachen'.
    In MSAccess ging das problemlos und logisch gesehen ist das in meinem Augen auch richtig (und notwendig).
    Wie kann man das Problem lösen?

    Vielen Dank
    Grüße von Torsten

     

    Hallo Torsten,

    diese Problematik löst man am besten innerhalb seiner "Delete-Prozedur". Dort kann man hinterlegen, was in welcher Reihenfolge alles gelöscht werden soll.


    Andreas Wolter (Blog | Twitter)
    MCM - Microsoft Certified Master SQL Server 2008
    MCSM - Microsoft Certified Solutions Master Data Platform, SQL Server 2012
    www.andreas-wolter.com | www.SarpedonQualityLab.com

    Sonntag, 16. März 2014 17:09

Alle Antworten