Příznaky
Předpokládejme, že se pokoušíte odstranit data z tabulky a na data se odkazuje v jiných tabulkách na Microsoft SQL Server 2016 a 2017. Když se podíváte na plán provedení dotazu, uvidíte, že používá operátor kontroly referencí na cizí klíč. V této situaci se může zobrazit následující chybová zpráva i v případě, že odstraněný řádek není odkazován v jiných tabulkách:
Zpráva 547, úroveň 16, stav 0, číslo řádku
Příkaz DELETE je v konfliktu s omezením ODKAZ
Stav
Společnost Microsoft potvrdila, že se jedná o problém produktů Microsoft, které jsou uvedeny v sekci Platí pro.
Řešení
Tento problém je opravený v následující kumulativní aktualizaci pro SQL Server:
Poznámka Tento problém je opravený v kumulativní aktualizaci 6 pro SQL Server 2016 SP2.
Informace o kumulativních aktualizacích pro SQL Server:
Každá nová kumulativní aktualizace pro SQL Server obsahuje všechny opravy hotfix a všechny opravy zabezpečení, které byly součástí předchozí kumulativní aktualizace. Podívejte se na nejnovější kumulativní aktualizace pro SQL Server:
Alternativní řešení
Chcete-li tento problém vyřešit, použijte jednu z následujících metod:
- Ke spuštění tohoto dotazu použijte úroveň kompatibility nižší než 130.
- Změňte strukturu indexu v odkazující tabulce.
Další informace
Počínaje úrovní kompatibility konfigurace s oborem databáze 130 V systému SQL Server 2016 může plán provedení dotazu používat operátor kontroly referencí na cizí klíč k ověření, zda na řádek v tabulce odkazují nějaké řádky v jiných tabulkách prostřednictvím omezení referenční integrity. Takový operátor lze použít, pokud na tabulku odkazuje velký počet cizích tabulek. V tomto operátoru SQL Server zvolí index v každé odkazující tabulce, aby provedl takovou kontrolu. Pokud má odkazující tabulka index s více sloupci klíče, nejsou tyto sloupce na začátku součástí cizího klíče, ale některé jiné sloupce jsou součástí cizího klíče. To může vést k nesprávné kontrole, kterou provádí SQL Server.
Podívejte se například na následující schéma:
Vytvoření tabulky TPK (pk int, constraint, cpk, primary key, clustered)
Vytvoření tabulky TFK (A INT, FK INT, CONSTRAINT, CFK, Odkazy na cizí klíč, TPK, index, IA, CLUSTERED(A,FK))
Takové schéma může vést k tomuto problému, ale pokud změníte pořadí sloupců v indexu ia na (fk,a), nestane se tak.
Reference
Podívejte se na informace o terminologii, kterou společnost Microsoft používá k popisování aktualizací softwaru.