KB4503379 – LØSNING: Begrensninger for referanseintegritet evalueres ikke på riktig måte når planen for spørringsutførelse bruker operatoren Referansesjekk for sekundærnøkkel i SQL Server 2016 og 2017

Gjelder for
SQL Server 2017 Developer Windows SQL Server 2017 Enterprise Windows SQL Server 2017 Enterprise Core Windows SQL Server 2017 Standard Windows

Symptomer

La oss si at du prøver å slette data fra en tabell, og at dataene refereres til i andre tabeller i Microsoft SQL Server 2016 og 2017. Hvis du utforsker planen for utførelse av spørringer, kan du se den bruke en referansekontrolloperator for sekundærnøkkel. I slike situasjoner kan du få følgende feilmelding selv om raden som slettes, ikke refereres til i andre tabeller:

Msg 547, nivå 16, delstat 0, linjenummer

DELETE-setningen kom i konflikt med REFERENCE-begrensningen

Status

Microsoft har bekreftet at dette er et problem i Microsoft-produktene som er oppført i delen «Gjelder for».

Oppløsning

Dette problemet er løst i følgende kumulative oppdatering for SQL Server:

Vær oppmerksom på Dette problemet er løst i Kumulativ oppdatering 6 for SQL Server 2016 SP2.

Om kumulative oppdateringer for SQL Server:

Hver nye kumulative oppdatering for SQL Server inneholder alle hurtigreparasjoner og alle sikkerhetsrettinger som fulgte med den forrige kumulative oppdateringen. Ta en titt på de nyeste kumulative oppdateringene for SQL Server:

Midlertidig løsning

Bruk en av følgende metoder for å omgå dette problemet:

  • Bruk kompatibilitetsnivå under 130 til å kjøre denne spørringen.
  • Endre indeksstrukturen i referansetabellen.

Mer informasjon

Starte kompatibilitetsnivå 130 for konfigurasjon med databaseomfang I SQL Server 2016 kan en spørringsutførelsesplan bruke operatoren Referansekontroll for sekundærnøkkel til å kontrollere om en rad i en tabell refereres til av noen rader i andre tabeller gjennom referanseintegritetsbegrensninger. Slike operatorer kan brukes hvis et stort antall sekundærtabeller refererer til en tabell. I denne operatoren velger SQL Server en indeks i hver referansetabell som skal utføre en slik kontroll. Hvis en refererende tabell har en indeks med flere nøkkelkolonner, er for eksempel noen kolonner i begynnelsen ikke en del av sekundærnøkkelen, men andre kolonner er en del av sekundærnøkkelen. Dette kan føre til feil kontroll som utføres av SQL Server.

Tenk deg for eksempel følgende skjema:

opprette tabell tpk (pk, int, constraint, cpk, primærnøkkel, gruppert)

opprette tabell tfk (A INT, FK, INT, betingelse, CFK, sekundærnøkkel, referanser, tpk, indeks, ia, gruppert(a,fk))

Et slikt skjema kan føre til dette problemet, men hvis du endrer rekkefølgen på kolonnene i indeks IA til (fk,a), vil det ikke føre til dette.

Kilder

Finn ut mer om terminologien som Microsoft bruker til å beskrive programvareoppdateringer.