Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro:SQL Server
Podrobnosti
| Attribute | Value |
|---|---|
| Název produktu | SQL Server |
| ID události | 1785 |
| Zdroj události | MSSQLSERVER |
| Součást | SQLEngine |
| Symbolický název | CRTFKINVTOPO |
| Text zprávy | Zavedení omezení CIZÍ KLÍČ '%.ls' na tabulce '%.ls' může způsobit cykly nebo více kaskádových cest. Specifikujte NA DELETE ŽÁDNOU AKCI nebo NA UPDATE ŽÁDNOU AKCI, nebo upravte další omezení CIZÍHO KLÍČE. |
Vysvětlení
Tuto chybovou hlášku obdržíte, protože v SQL Server se tabulka nemůže objevit více než jednou v seznamu všech kaskádových referenčních akcí, které jsou zahájeny buď příkazemDELETE, nebo příkazemUPDATE. Strom kaskádových referenčních akcí musí mít pouze jednu cestu k konkrétní tabulce na stromu kaskádových referenčních akcí.
Uživateli je nahlášena chybová zpráva jako následující:
Server: Msg 1785, úroveň 16, stav 1, řádek 1 Zavedení omezení CIZÍ KLÍČ 'fk_two' v tabulce 'table2' může způsobit cykly nebo více kaskádových cest. Specifikujte NA DELETE ŽÁDNOU AKCI nebo NA UPDATE ŽÁDNOU AKCI, nebo upravte další omezení CIZÍHO KLÍČE. Server: Msg 1750, úroveň 16, stav 1, řádek 1 Nepodařilo se vytvořit omezení. Viz předchozí chyby
Akce uživatele
Pro vyřešení tohoto problému vytvořte cizí klíč, který vytvoří jedinou cestu k tabulce v seznamu kaskádových referenčních akcí.
Referenční integritu lze vynutit několika způsoby. Deklarativní referenční integrita (DRI) je nejzákladnější způsob, ale zároveň nejméně flexibilní. Pokud potřebujete větší flexibilitu, ale stále chcete vysokou míru integrity, můžete místo toho použít spouště.
Více informací
Následující ukázkový kód je příkladem pokusu o vytvoření CIZÍHO KLÍČE, který generuje chybovou zprávu:
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.