Įvadas
Pradedant nuo "SQL Server 2012" leidimų, iš naujo paleidus "SQL Server" egzempliorių, lentelės automatinio augimo stulpelio reikšmė šokinėja, o konkreti šuolio reikšmė nustatoma pagal augimo stulpelio duomenų tipą. Jei duomenų tipas yra int, šuolio reikšmė yra 1000, o jei duomenų tipas yra bigint, šuolio reikšmė yra 10000. Mūsų projekte tokia šokinėjimo problema yra nepriimtina, ypač kai rodoma kliento pusėje. Ši keista problema yra tik "SQL Server 2012" ir naujesnėse versijose, o ankstesnėse "SQL Server 2012" versijose jos nėra.
fonas
Prieš kelias dienas kolega iš mūsų QA komandos pasiūlė: Mūsų lentelės savaime didėjančio stulpelio vertė nepaaiškinamai šoktelėjo 10 000. Kitaip tariant, paskutinė lentelės savaime didinančio stulpelio reikšmė buvo 2200, bet dabar, kai įtraukėme naują įrašą, savaime didinamo stulpelio reikšmė tapo 12200. Pagal mūsų verslo logiką, tokios situacijos klientui neleidžiamos, todėl turime išspręsti šią problemą.
Kodo naudojimas
Iš pradžių mes visi buvome labai keisti, kaip tai atsitiko? Paprastai rankiniu būdu neįterpiame jokių reikšmių į savaime didėjančius stulpelius (rankiniu būdu įterpti reikšmes į savaime išpučiamus stulpelius yra gerai), o savaime išpučiamų stulpelių reikšmes prižiūri pati duomenų bazė. Mūsų pagrindinės komandos narys pradėjo tyrinėti šį klausimą ir rado atsakymą. Dabar norėčiau išsamiai paaiškinti šią problemą ir sprendimą, kurį rado mano kolega.
Kaip atkurti šią klaidą
Turėsite įdiegti SQL Server 2012 ir sukurti bandomąją duomenų bazę. Tada sukurkite lentelę su savaime augančiais stulpeliais:
Dabar įterpkite du duomenis:
Peržiūrėkite rezultatus:
Šiuo metu rezultatas buvo toks pat, kokio tikėjomės. Dabar iš naujo paleiskite SQL serverio paslaugą. Yra keli būdai, kaip iš naujo paleisti SQL paslaugą, ir čia mes naudojame SQL serverio tvarkyklę, kad ją paleistume iš naujo:
Paleidę iš naujo, į lentelę įterpiame dar 2 duomenų vienetus:
Peržiūrėkite rezultatus:
Dabar matote rezultatus iš naujo paleidę "SQL Server 2012", o jo savaime didėjančios stulpelio reikšmės prasideda nuo 1002. Tai yra, šoktelėjo 1000. Kaip minėta anksčiau, jei pridedame duomenų tipą bigint, jo šuolio vertė bus 10 000.
Ar tai tikrai klaida?
"Microsoft" teigia, kad tai yra funkcija, o ne klaida ir yra naudinga daugeliu atvejų. Tačiau mūsų atveju mums tokios funkcijos nereikia, nes šie savaiminiai duomenys yra skirti parodyti klientams, o klientai jausis keistai, jei pamatys tokius šokinėjančius duomenis. O šuolio reikšmė nustatoma pagal tai, kiek kartų iš naujo paleidžiate SQL serverį. Jei šie duomenys nerodomi klientams, jie gali būti priimtini. Todėl ši funkcija paprastai tinka tik vidiniam naudojimui.
sprendimas
Jei mūsų nedomina ši "Microsoft" siūloma "funkcija", yra du būdai, kaip ją išjungti.
1. Sekų naudojimas
2. Užregistruokite SQL serverio paleisties parametrą -t272
Sekų naudojimas
Pirmiausia turime pašalinti savaime didėjančius lentelės stulpelius. Tada sukurkite seką be talpyklos, iš kurios įterpiamos skaitinės reikšmės. Štai kodo pavyzdys:
Užregistruokite paleidimo parametrą -t272
Atidarykite SQL serverio konfigūracijos tvarkytuvą. Pasirinkite "SQL Server 2012" egzempliorių, dešiniuoju pelės mygtuku spustelėkite ir pasirinkite meniu Ypatybės. Iššokančiajame lange raskite paleidimo parametrus ir užregistruokite -t272. Baigę iš naujo paleiskite SQL serverį (SQLSERVER2012) žemiau esančiame paveikslėlyje ir atlikite klaidų atkūrimo operaciją, kad patikrintumėte, ar problema išspręsta.
Papildomos pastabos:
Jei jūsų duomenų bazėje yra daug savaime išpučiamų lentelių ir jos visos turi skaičių šuolių problemų, geriau naudoti antrąją parinktį. Nes tai labai paprasta, o taikymo sritis yra serverio lygio. Antrojo sprendimo priėmimas turės įtakos visoms šio tarnybos egzemplioriaus duomenų bazėms.
|