MSSQLSERVER_1785

Gäller för:SQL Server

Details

Attribute Value
Produktnamn SQL Server
Händelse-ID 1785
Händelsekälla MSSQLSERVER
Component SQLEngine
Symboliskt namn CRTFKINVTOPO
Meddelandetext Att införa FOREIGN KEY-begränsningen '%.ls' på tabell '%.ls' kan orsaka cykler eller flera kaskadvägar. Ange PÅ DELETE INGEN ÅTGÄRD eller PÅ UPDATE INGEN ÅTGÄRD, eller ändra andra FRÄMMANDE NYCKEL-begränsningar.

Explanation

Du får detta felmeddelande eftersom en tabell i SQL Server inte kan förekomma mer än en gång i en lista över alla kaskaderande referensåtgärder som startas av antingen en DELETE sats eller en UPDATE sats. Trädet av kaskaderande referensåtgärder får endast ha en väg till en viss tabell i det kaskaderande referensåtgärdsträdet.

Ett felmeddelande som följande rapporteras till användaren:

Server: Msg 1785, nivå 16, Tillstånd 1, rad 1 Introduktion av FRÄMMANDE NYCKEL-begränsningen 'fk_two' på tabell 'tabell2' kan orsaka cykler eller flera kaskadvägar. Ange PÅ DELETE INGEN ÅTGÄRD eller PÅ UPDATE INGEN ÅTGÄRD, eller ändra andra FRÄMMANDE NYCKEL-begränsningar. Server: Msg 1750, nivå 16, Tillstånd 1, Linje 1 Kunde inte skapa begränsning. Se tidigare fel

Användaråtgärd

För att lösa detta problem, skapa en främmande nyckel som skapar en enda väg till en tabell i en lista med kaskaderande referensåtgärder.

Du kan upprätthålla referensiell integritet på flera sätt. Deklarativ referensiell integritet (DRI) är det mest grundläggande sättet, men också det minst flexibla. Om du behöver mer flexibilitet men ändå vill ha hög integritet kan du använda triggers istället.

Mer information

Följande exempelkod är ett exempel på ett försök till att skapa FRÄMMANDE NYCKEL som genererar felmeddelandet:

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.

Se även

Kaskadreferensiell integritet