KB4503379 – FIX: viitamistervikluse piiranguid ei hinnata õigesti, kui päringu käivitamise plaan kasutab SQL Server 2016 ja 2017 tehtemärki Välisvõtme viitekontroll

Rakenduskoht
SQL Server 2017 Developer Windows SQL Server 2017 Enterprise Windows SQL Server 2017 Enterprise Core Windows SQL Server 2017 Standard Windows

Sümptomid

Oletagem, et proovite kustutada andmeid tabelist ja andmetele viidatakse teistes tabelites Microsoft SQL Server 2016 ja 2017. Päringu käivitamisplaani uurimisel näete, et see kasutab tehtemärki Välisvõtme viitekontroll. Sellisel juhul võidakse kuvada järgmine tõrketeade ka siis, kui kustutatavale reale ei ole teistes tabelites viidatud:

Msg 547, tase 16, olek 0, reanumber

Lause DELETE on vastuolus viitekitsendusega

Olek

Microsoft on kinnitanud, et see on jaotises „Rakenduskoht“ loetletud Microsofti toodete korral esinev probleem.

Lahendus

See probleem on lahendatud järgmises SQL Server koondvärskenduses:

Märkus See probleem on lahendatud SQL Server 2016 SP2 koondvärskenduses 6.

Teave SQL Server koondvärskenduste kohta.

Iga uus koondvärskendus SQL Server sisaldab kõiki kiirparandusi ja kõiki turbeparandusi, mis olid kaasatud eelmise koondvärskenduse. Vaadake uusimaid SQL Server koondvärskendusi.

Ajutine lahendus

Selle probleemi lahendamiseks kasutage ühte järgmistest meetoditest.

  • Kasutage selle päringu käivitamiseks ühilduvustaset alla 130.
  • Muutke viitetabeli registristruktuuri.

Veel teavet

Andmebaasi ulatusega konfiguratsiooni ühilduvustaseme 130 käivitamisel rakenduses SQL Server 2016 saab päringu käivitamisplaan kasutada välisvõtme viitekontrolli tehtemärki, et kontrollida, kas mõnele tabeli reale on viitamistervikluse piirangute kaudu viidatud mõnele tabeli reale. Seda tehtemärki saab kasutada juhul, kui tabelile viitab suur hulk välistabeleid. Selles tehtemärgis valib SQL Server igas viitamistabelis sellise kontrolli tegemiseks indeksi. Kui viitetabelil on mitme võtmeveeruga indeks, ei ole mõned veerud alguses võõrvõtme osad, kuid mõned muud veerud on osa võõrvõtmest. See võib põhjustada SQL Server vale kontrolli.

Mõelge näiteks järgmisele skeemile.

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

create table tfk (a int, fk int constraint cfk foreign key references tpk, index ia clustered(a,fk))

Selline skeem võib põhjustada selle probleemi, kuid kui muudate veergude järjestust indeksis ia (fk,a), siis see ei ole.

Viited

Lisateave Microsofti tarkvaravärskenduste terminoloogia kohta.