Introduksjon
Fra og med SQL Server 2012-utgivelsene, når SQL Server-instansen startes på nytt, hopper verdien av den automatiske vekstkolonnen i tabellen, og den spesifikke hoppverdien bestemmes av datatypen i vekstkolonnen. Hvis datatypen er int, er hoppverdien 1000, og hvis datatypen er bigint, er hoppverdien 10000. Fra vårt prosjekt er denne typen hoppeproblem uakseptabelt, spesielt når det vises på klientsiden. Dette merkelige problemet finnes kun i SQL Server 2012 og senere, og det finnes ikke i versjoner før SQL Server 2012.
bakgrunn
For noen dager siden foreslo en kollega fra vårt QA-team: Verdien av den selvøkende kolonnen på bordet vårt hoppet uforklarlig med 10 000. Med andre ord, den siste verdien i den selvinkrementerende kolonnen i tabellen vår var 2200, men nå som vi har lagt til en ny post, har verdien av den selvinkrementerende kolonnen blitt 12200. I vår forretningslogikk er slike situasjoner ikke tillatt på klienten, så vi må løse dette problemet.
Bruk av kode
Først var vi alle veldig merkelige, hvordan skjedde dette? Vi setter vanligvis ikke inn noen verdier manuelt i selvforsterkende kolonner (det er greit å sette inn verdier manuelt i selvoppblåsende kolonner), og verdiene til selvoppblåsende kolonner vedlikeholdes av databasen selv. Et medlem av kjerneteamet vårt begynte å undersøke dette spørsmålet og fant svaret. Nå vil jeg gjerne forklare dette problemet i detalj og løsningen kollegaen min fant.
Hvordan gjenskape denne feilen
Du må installere SQL Server 2012 og deretter opprette en testdatabase. Opprett deretter en tabell med selvvoksende kolonner:
Nå sett inn to databiter:
Gå gjennom resultatene:
På dette tidspunktet var resultatet det samme som vi forventet. Nå starter du SQL Server-tjenesten din på nytt. Det finnes flere måter å starte SQL Service på nytt, og her bruker vi SQL Server Manager for å starte det på nytt:
Etter omstart setter vi inn 2 nye datastykker i tabellen nettopp:
Gå gjennom resultatene:
Nå ser du resultatene etter omstart av SQL Server 2012, og de selvøkende kolonneverdiene starter på 1002. Det vil si, hoppet 1000. Som nevnt tidligere, hvis datatypen vi legger til er bigint, vil hoppverdien være 10 000.
Er det virkelig en BUG?
Microsoft sier at dette er en funksjon, ikke en feil, og at det er nyttig i mange situasjoner. Men i vårt tilfelle trenger vi ikke en slik funksjon, fordi disse selv-inkrementelle dataene er ment å vises til kundene, og kundene vil føle seg rare hvis de ser slik hoppende data. Og hoppverdien bestemmes av hvor mange ganger du starter SQL Server på nytt. Hvis disse dataene ikke vises til kundene, kan det være akseptabelt. Derfor er denne funksjonen vanligvis kun egnet for intern bruk.
løsning
Hvis vi ikke er interessert i denne "funksjonen" som Microsoft tilbyr, finnes det to måter vi kan slå den av på.
1. Bruk av sekvenser
2. Registrer oppstartsparameteren -t272 for SQL Server
Bruk sekvenser
Først må vi fjerne de selvøkende kolonnene i tabellen. Deretter oppretter du en sekvens uten caching, hvorfra de numeriske verdiene settes inn. Her er eksempelkoden:
Registrer oppstartsparameteren -t272
Åpne SQL Server Configuration Manager. Velg din SQL Server 2012-instans, høyreklikk og velg menyen Egenskaper. Finn oppskytingsparametrene i popup-vinduet og registrer -t272. Etter ferdigstillelse, start SQL Server (SQLSERVER2012) i figuren nedenfor på nytt, og utfør deretter feilgjengivelsesoperasjonen for å verifisere om problemet er løst.
Ytterligere notater:
Hvis du har mange selvoppblåsende tabeller i databasen din og de alle har numeriske hoppproblemer, er det bedre å bruke det andre alternativet. Fordi det er veldig enkelt og omfanget er servernivå. Å ta i bruk den andre løsningen vil påvirke alle databaser på denne tjenesteinstansen.
|