KB4503379 - REMEDIERE: Restricțiile de integritate referențială nu sunt evaluate corect atunci când planul de executare a interogării utilizează operatorul Verificare referințe cheie străină în SQL Server 2016 și 2017

Se aplică la
SQL Server 2017 Developer Windows SQL Server 2017 Enterprise Windows SQL Server 2017 Enterprise Core Windows SQL Server 2017 Standard Windows

Simptome

Să presupunem că încercați să ștergeți date dintr-un tabel și că datele sunt menționate în alte tabele din Microsoft SQL Server 2016 și 2017. Dacă explorați planul de executare a interogării, puteți vedea că acesta utilizează un operator de verificare a referințelor la chei străine. În această situație, este posibil să primiți următorul mesaj de eroare chiar dacă rândul șters nu este menționat în alte tabele:

msg 547, nivel 16, stare 0, lineNumber

Instrucțiunea DELETE a intrat în conflict cu restricția REFERENCE

Stare

Microsoft a confirmat că aceasta este o problemă în produsele Microsoft care sunt listate în secțiunea „Se aplică la”.

Rezolvare

Această problemă este remediată în următoarea actualizare cumulativă pentru SQL Server:

Notă Această problemă este remediată în actualizarea cumulativă 6 pentru SQL Server 2016 SP2.

Despre actualizările cumulative pentru SQL Server:

Fiecare actualizare cumulativă nouă pentru SQL Server conține toate remedierile rapide și toate remedierile de securitate care au fost incluse cu actualizarea cumulativă anterioară. Consultați cele mai recente actualizări cumulative pentru SQL Server:

Soluție

Pentru a evita această problemă, utilizați una dintre metodele următoare:

  • Utilizați nivelul de compatibilitate sub 130 pentru a rula această interogare.
  • Modificați structura indexului în tabelul de referință.

Mai multe informații

Începând cu nivelul de compatibilitate 130 al configurației din domeniul bazei de date în SQL Server 2016, un plan de executare a interogărilor poate utiliza operatorul Verificare referințe de cheie străină pentru a verifica dacă un rând dintr-un tabel este menționat de orice rând din alte tabele, prin restricții de integritate referențială. Un astfel de operator poate fi utilizat dacă un tabel este menționat de un număr mare de tabele străine. În acest operator, SQL Server alege un index din fiecare tabel de referințe pentru a efectua o astfel de verificare. Dacă un tabel de referință are un index cu mai multe coloane cheie, unele coloane de la început nu fac parte din cheia externă, dar alte câteva coloane fac parte din cheia externă. Acest lucru poate avea drept consecință o verificare incorectă efectuată de SQL Server.

De exemplu, să presupunem următoarea schemă:

create table tpk (pk, int constraint, cpk, primary key clustered)

Crearea unui tabel TFK (A, INT, FK, INT, CONSTRAINT, CFK, FOREIGN KEY, references TPK, INDEX, IA, Clustered(A,FK))

O astfel de schemă poate avea această problemă, dar dacă modificați ordinea coloanelor din indexul ia la (fk,a), nu se va întâmpla.

Referințe

Aflați despre terminologia pe care o utilizează Microsoft pentru a descrie actualizările de software.