DBAtlas · Atlas für Datenbankbetrieb

1785: Introducing FOREIGN KEY constraint may cause cycles or multiple cascade paths

SQL Server

Was bedeutet das?

Der hinzuzufügende Foreign Key könnte bei kaskadierenden Operationen (ON DELETE/UPDATE CASCADE) einen Zyklus oder mehrere kaskadierende Lösch-/Aktualisierungspfade zur selben Tabelle erzeugen. SQL Server lehnt ihn ab, um mehrdeutiges Kaskadenverhalten zu vermeiden.

Ursache

Ein FK mit Kaskadenaktion, der einen Zirkelbezug zwischen Tabellen (A->B->A) oder mehrere Kaskadenpfade zu einer Tabelle erzeugt. SQL Server verbietet das, um mehrdeutige Kaskadenreihenfolgen und Endlosschleifen zu verhindern.

Lösung

Definiere den Foreign Key als ON DELETE NO ACTION / ON UPDATE NO ACTION (entferne die Kaskade): ALTER TABLE child ADD CONSTRAINT fk ... FOREIGN KEY (...) REFERENCES parent(...) ON DELETE NO ACTION; Implementiere das benötigte kaskadierende Löschen mit einem INSTEAD OF DELETE-Trigger: Der Trigger löscht zuerst die Kindzeilen, dann die Elternzeile (z. B. DELETE c FROM child c JOIN deleted d ON c.parent_id = d.id; DELETE e FROM parent e JOIN deleted d ON e.id = d.id;). Ein AFTER DELETE-Trigger funktioniert nicht; die FK-Prüfung läuft vor dem Trigger, daher wird das Löschen mit Fehler 547 abgelehnt. Prüfe zirkuläre Abhängigkeiten im Datenmodell.

In DBAtlas öffnen →

Weitere Einträge zu dieser Datenbank