MSSQLSERVER_1785
Gilt für: SQL Server
Details
attribute | Wert |
---|---|
Produktname | SQL Server |
Ereignis-ID | 1785 |
Ereignisquelle | MSSQLSERVER |
Komponente | SQLEngine |
Symbolischer Name | CRTFKINVTOPO |
Meldungstext | Das Einführen der FOREIGN KEY-Einschränkung "%.ls" für die "%.ls"-Tabelle kann Schleifen oder mehrere Kaskadepfade verursachen. Geben Sie ON DELETE NO ACTION oder ON UPDATE NO ACTION an, oder ändern Sie andere FOREIGN KEY-Einschränkungen. |
Erklärung
Diese Fehlermeldung wird angezeigt, weil in SQL Server eine Tabelle nur einmal in einer Liste aller kaskadierenden referenziellen Aktionen vorkommen kann, die entweder durch eine DELETE
- oder UPDATE
-Anweisung gestartet werden. Die Struktur von kaskadierenden referenziellen Aktionen darf nur einen Pfad zu einer bestimmten Tabelle in der Struktur der kaskadierenden referenziellen Aktionen aufweisen.
Dem Benutzer wird eine Fehlermeldung wie die folgende angezeigt:
Server: Msg 1785, Level 16, State 1, Zeile 1 Einführung der FOREIGN KEY-Einschränkung "fk_two" in Tabelle "Tabelle2" kann zu Zyklen oder mehreren Kaskadenpfaden führen. Geben Sie ON DELETE NO ACTION oder ON UPDATE NO ACTION an, oder ändern Sie andere FOREIGN KEY-Einschränkungen. Server: Msg 1750, Level 16, State 1, Zeile 1 Konnte keine Einschränkung erstellen. Siehe vorherige Fehler
Aktion des Benutzers
Um dieses Problem zu lösen, erstellen Sie einen Fremdschlüssel, der einen einzigen Pfad zu einer Tabelle in einer Liste mit kaskadierenden referenziellen Aktionen erstellt.
Sie können die referenzielle Integrität auf verschiedene Weise erzwingen. Die deklarative referentielle Integrität (DRI) ist die einfachste, aber auch die am wenigsten flexible Methode. Wenn Sie mehr Flexibilität benötigen, aber dennoch ein hohes Maß an Integrität wünschen, können Sie stattdessen Trigger verwenden.
Weitere Informationen
Der folgende Beispielcode ist ein Beispiel für den FOREIGN KEY-Erstellungsversuch, der die Fehlermeldung generiert:
USE tempdb
GO
CREATE TABLE table1 (user_ID INTEGER NOT NULL PRIMARY KEY, user_name
CHAR(50) NOT NULL)
GO
CREATE TABLE table2 (author_ID INTEGER NOT NULL PRIMARY KEY, author_name
CHAR(50) NOT NULL, lastModifiedBy INTEGER NOT NULL, addedby INTEGER NOT NULL)
GO
ALTER TABLE table2 ADD CONSTRAINT fk_one FOREIGN KEY (lastModifiedby)
REFERENCES table1 (user_ID) ON DELETE CASCADE ON UPDATE cascade
GO
ALTER TABLE table2 ADD CONSTRAINT fk_two FOREIGN KEY (addedby)
REFERENCES table1(user_ID) ON DELETE NO ACTION ON UPDATE cascade
GO
--this fails with the error because it provides a second cascading path to table2.
ALTER TABLE table2 ADD CONSTRAINT fk_two FOREIGN KEY (addedby)
REFERENCES table1 (user_ID) ON DELETE NO ACTION ON UPDATE NO ACTION
GO
-- this works.