Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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.