KB4503379 – OPRAVA: Omezení referenční integrity nejsou správně vyhodnocována, když plán provedení dotazu používá operátor kontroly referencí cizího klíče v SQL Server 2016 a 2017

Platí pro
SQL Server 2017 Developer Windows SQL Server 2017 Enterprise Windows SQL Server 2017 Enterprise Core Windows SQL Server 2017 Standard Windows

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.