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.