Johdanto
SQL Server 2012 -julkaisuista alkaen, kun SQL Server -instanssi käynnistetään uudelleen, taulukon automaattisen kasvusarakkeen arvo hyppää ja tarkka hyppyarvo määräytyy kasvusarakkeen tietotyypin mukaan. Jos datatyyppi on int, hyppyarvo on 1000, ja jos datatyyppi on bigint, hyppyarvo on 10000. Projektimme mukaan tällainen hyppyongelma on täysin hyväksymätön, varsinkin kun se näkyy asiakkaan puolella. Tämä outo ongelma esiintyy vain SQL Server 2012:ssa ja uudemmissa versioissa, eikä sitä ole olemassa versioissa ennen SQL Server 2012:ta.
tausta
Muutama päivä sitten eräs kollega QA-tiimistämme ehdotti: Taulukkomme itsestään kasvavan sarakkeen arvo nousi selittämättömästi 10 000:lla. Toisin sanoen, taulukossamme itsestään kasvavan sarakkeen viimeinen arvo oli 2200, mutta nyt kun olemme lisänneet uuden tietueen, itsekasvatetun sarakkeen arvoksi on tullut 12200. Liiketoimintalogiikassamme tällaiset tilanteet eivät ole sallittuja asiakkaalle, joten meidän täytyy ratkaista tämä ongelma.
Koodin käyttö
Aluksi olimme kaikki hyvin outoja, miten tämä tapahtui? Emme yleensä lisää arvoja manuaalisesti itsestään kasvaviin sarakkeisiin (arvojen manuaalinen lisääminen itsetäyttyviin sarakkeisiin on ok), ja itsetäyttyvien sarakkeiden arvot säilytetään tietokannan toimesta. Yksi ydintiimimme jäsenistä alkoi tutkia tätä kysymystä ja löysi vastauksen. Nyt haluaisin selittää tämän ongelman yksityiskohtaisesti ja ratkaisun, jonka kollegani löysi.
Kuinka toistaa tämä bugi
Sinun täytyy asentaa SQL Server 2012 ja luoda testitietokanta. Sitten luo taulukko itsestään kasvavilla sarakkeilla:
Lisää nyt kaksi tietoa:
Käy läpi tulokset:
Tässä vaiheessa lopputulos oli sama kuin odotimme. Käynnistä nyt SQL Server -palvelusi uudelleen. SQL Service voi käynnistää uudelleen useita tapoja, ja tässä käytämme SQL Server Manageria sen uudelleenkäynnistämiseen:
Uudelleenkäynnistyksen jälkeen lisäämme juuri nyt taulukkoon vielä kaksi tietopalaa:
Käy läpi tulokset:
Nyt näet tulokset SQL Server 2012:n uudelleenkäynnistyksen jälkeen, ja sen itsestään kasvavat sarakkeet alkavat arvosta 1002. Eli hyppäsi 1000. Kuten aiemmin mainittiin, jos lisättävä tietotyyppi on bigint, sen hyppyarvo on 10 000.
Onko se oikeasti BUGI?
Microsoft toteaa, että tämä on ominaisuus, ei bugi, ja hyödyllinen monissa tilanteissa. Mutta meidän tapauksessamme emme tarvitse tällaista toimintoa, koska tämä itseinkrementaalinen data on tarkoitettu näytettäväksi asiakkaille, ja asiakkaat tuntevat olonsa oudoksi, jos näkevät tällaista hyppäävää dataa. Hyppyarvo määräytyy sen mukaan, kuinka monta kertaa käynnistät SQL Serverin uudelleen. Jos näitä tietoja ei näytetä asiakkaille, se voi olla hyväksyttävää. Siksi tämä ominaisuus soveltuu yleensä vain sisäiseen käyttöön.
ratkaisu
Jos emme ole kiinnostuneita Microsoftin tarjoamasta "ominaisuudesta", voimme poistaa sen käytöstä kahdella tavalla.
1. Sekvenssien käyttö
2. Rekisteröi käynnistysparametri -t272 SQL Serverille
Käytä sekvenssejä
Ensiksi meidän täytyy poistaa taulukon itsestään kasvavat sarakkeet. Sitten luodaan jono ilman välimuistia, josta numeeriset arvot lisätään. Tässä on esimerkkikoodi:
Rekisteröi käynnistysparametri -t272
Avaa SQL Server Configuration Manager. Valitse SQL Server 2012 -instanssi, napsauta hiiren oikealla ja valitse Ominaisuudet-valikko. Etsi laukaisuparametrit ponnahdusikkunasta ja rekisteröi -t272. Suorituksen jälkeen käynnistä SQL Server (SQLSERVER2012) uudelleen alla olevassa kuvassa ja suorita sitten virheiden toistotoiminto varmistaaksesi, onko ongelma ratkaistu.
Lisähuomautuksia:
Jos tietokannassasi on paljon itsestään täyttyviä taulukoita ja niissä kaikissa on numeerisia hyppyongelmia, on parempi käyttää toista vaihtoehtoa. Koska se on hyvin yksinkertaista ja laajuus on palvelintasolla. Toisen ratkaisun käyttöönotto vaikuttaa kaikkiin tämän palveluinstanssin tietokantoihin.
|