Uvod
Začenši z izdajami SQL Server 2012, ko se instanca SQL Server ponovno zažene, se vrednost stolpca samodejne rasti v tabeli preskoči, specifična vrednost skoka pa je določena s tipom podatkov v stolpcu rasti. Če je podatkovni tip int, je vrednost skoka 1000, če je tip podatkov bigint, je vrednost skoka 10000. Po našem projektu je takšen problem skakanja nesprejemljiv, še posebej, če se pojavi na strani odjemalca. Ta nenavadna težava je prisotna le v SQL Server 2012 in kasnejših, v različicah pred SQL Server 2012 pa ni obstajala.
ozadje
Pred nekaj dnevi je kolega iz naše QA ekipe predlagal: Vrednost samonaraščajočega stolpca naše tabele se je nepojasnjeno povečala za 10.000. Z drugimi besedami, zadnja vrednost stolpca samopovečevanja v naši tabeli je bila 2200, zdaj pa, ko smo dodali nov rekord, je vrednost stolpca, ki se samopoveča, postala 12200. V naši poslovni logiki takšne situacije naročniku niso dovoljene, zato moramo ta problem rešiti.
Uporaba kode
Sprva smo bili vsi zelo čudni, kako se je to zgodilo? Običajno ne vnašamo nobenih vrednosti ročno v samopovečevalne stolpce (ročno vstavljanje vrednosti v samonapihovalne stolpce je v redu), vrednosti samonapihovalnih stolpcev pa vzdržuje sama baza podatkov. Član naše osrednje ekipe je začel raziskovati to vprašanje in našel odgovor. Zdaj bi rad podrobno razložil ta problem in rešitev, ki jo je našel moj kolega.
Kako reproducirati to napako
Namestiti boste morali SQL Server 2012 in nato ustvariti testno bazo podatkov. Nato ustvarite tabelo s samonaraščajočimi stolpci:
Zdaj vstavite dva podatka:
Preberite rezultate:
V tem trenutku je bil rezultat enak, kot smo pričakovali. Zdaj ponovno zaženi svojo SQL Server storitev. Obstaja več načinov za ponovni zagon SQL storitve, tukaj pa uporabljamo SQL Server Manager za njen ponovni zagon:
Po ponovnem zagonu pravkar vnesemo še 2 podatka v tabelo:
Preberite rezultate:
Zdaj vidite rezultate po ponovnem zagonu SQL Server 2012, kjer se samopovečevanje stolpčnih vrednosti začne pri 1002. To pomeni, da je skočil za 1000. Kot je bilo že omenjeno, če je dodani podatkovni tip bigint, bo njegova vrednost skoka 10.000.
Je to res NAPAKA?
Microsoft navaja, da je to funkcija, ne napaka, in je uporabna v mnogih primerih. V našem primeru pa takšne funkcije ne potrebujemo, ker so ti samoinkrementalni podatki namenjeni prikazu strankam, stranke pa se bodo počutile nenavadno, če bodo videle takšne skakajoče podatke. Vrednost skoka je določena s številom ponovnih zagonov SQL Serverja. Če ti podatki niso prikazani strankam, so morda sprejemljivi. Zato je ta funkcija običajno primerna le za notranjo uporabo.
rešitev
Če nas ta "funkcija", ki jo ponuja Microsoft, ne zanima, obstajata dva načina, da jo izklopimo.
1. Uporaba zaporedij
2. Registrirajte zagonski parameter -t272 za SQL Server
Zaporedja uporabe
Najprej moramo odstraniti samopovečevajoče se stolpce tabele. Nato ustvarite zaporedje brez predpomnjenja, iz katerega se vstavijo številčne vrednosti. Tukaj je vzorčna koda:
Registrirajte zagonski parameter -t272
Odpri SQL Server Configuration Manager. Izberite svojo instanco SQL Server 2012, kliknite z desno mišico in izberite meni Lastnosti. Poiščite parametre zagona v pojavnem oknu in registrirajte -t272. Po zaključku ponovno zaženite SQL Server (SQLSERVER2012) na spodnji sliki in nato izvedite operacijo reprodukcije napak, da preverite, ali je bila težava rešena.
Dodatne opombe:
Če imate v bazi veliko samonapihnjenih tabel in imajo vse težave s številčnimi preskoki, je bolje uporabiti drugo možnost. Ker je zelo preprosta in obseg je na ravni strežnika. Sprejetje druge rešitve bo vplivalo na vse baze podatkov na tej instanci storitve.
|