Sissejuhatus
Alates SQL Server 2012 väljaannetest, kui SQL Serveri instants taaskäivitatakse, hüppab tabeli automaatse kasvu veeru väärtus ning spetsiifiline hüppe väärtus määratakse kasvuveeru andmetüübi järgi. Kui andmetüüp on int, on hüppeväärtus 1000, ja kui andmetüüp on bigint, on hüppeväärtus 10000. Meie projekti põhjal on selline hüppamisprobleem vastuvõetamatu, eriti kui seda näidata kliendi poolel. See kummaline probleem esineb ainult SQL Server 2012 ja hilisemates versioonides ning seda ei esine versioonides enne SQL Server 2012.
Taust
Mõni päev tagasi pakkus meie kvaliteedikontrolli meeskonna kolleeg: Meie tabeli isekasvava veeru väärtus hüppas seletamatult 10 000 võrra. Teisisõnu, meie tabeli isekasvava veeru viimane väärtus oli 2200, kuid nüüd, kui oleme lisanud uue kirje, on isekasvava veeru väärtus muutunud 12200-ks. Meie äriloogika järgi ei lubata selliseid olukordi kliendile, seega peame selle probleemi lahendama.
Koodi kasutamine
Alguses olime kõik väga kummalised, kuidas see juhtus? Me tavaliselt ei sisesta automaatselt ühtegi väärtust isekasvavatesse veergudesse (käsitsi sisestamine isetäituvatesse veergudesse on täiesti okei) ning isetäituvate veergude väärtused säilitab andmebaas ise. Meie tuumikmeeskonna liige hakkas seda küsimust uurima ja leidis vastuse. Nüüd tahaksin seda probleemi üksikasjalikult selgitada ja lahendust, mille mu kolleeg leidis.
Kuidas seda viga taasluua
Pead installima SQL Server 2012 ja seejärel looma testandmebaasi. Seejärel loo tabel isekasvavate veergudega:
Nüüd sisesta kaks andmetükki:
Vaata tulemusi:
Sel hetkel oli tulemus täpselt see, nagu ootasime. Nüüd taaskäivita oma SQL Server teenus. SQL Service'i taaskäivitamiseks on mitu võimalust ning siin kasutame SQL Server Managerit selle taaskäivitamiseks:
Pärast taaskäivitamist lisame just praegu tabelisse veel kaks andmetükki:
Vaata tulemusi:
Nüüd näed tulemusi pärast SQL Server 2012 taaskäivitamist ja selle isekasvavad veeru väärtused algavad 1002-st. See tähendab, et hüppas 1000. Nagu varem mainitud, kui lisatud andmetüüp on bigint, on selle hüppeväärtus 10 000.
Kas see on tõesti viga?
Microsoft väidab, et see on funktsioon, mitte viga, ja on kasulik paljudes olukordades. Aga meie puhul pole sellist funktsiooni vaja, sest see ise-inkrementaalne info on mõeldud klientidele näitamiseks ja kliendid tunnevad end imelikult, kui nad näevad sellist hüppavat andmet. Ja hüppeväärtus määratakse selle järgi, mitu korda sa SQL Serverit taaskäivitad. Kui neid andmeid klientidele ei näidata, võib see olla vastuvõetav. Seetõttu sobib see funktsioon tavaliselt ainult sisekasutuseks.
lahus
Kui see Microsofti pakutav "funktsioon" meid ei huvita, on kaks võimalust, kuidas selle välja lülitada.
1. Järjestuste kasutamine
2. Registreeri SQL Serveri käivitamisparameeter -t272
Kasuta järjestusi
Esiteks peame eemaldama tabeli isekasvavad veerud. Seejärel luuakse järjestus ilma vahemällu salvestamiseta, kust lisatakse numbrilised väärtused. Siin on näidiskood:
Registreeri käivitusparameeter -t272
Ava SQL Server konfiguratsioonihaldur. Vali oma SQL Server 2012 instant, tee paremklõps ja vali Properties menüü. Leia käivitusparameetrid hüpikaknast ja registreeri -t272. Pärast lõpetamist taaskäivita SQL Server (SQLSERVER2012) alloleval joonisel ning seejärel vii läbi vea taasloomise operatsioon, et kontrollida, kas probleem on lahendatud.
Lisamärkused:
Kui sul on andmebaasis palju isetäituvaid tabeleid ja kõigil on numbrilise hüppe probleem, siis on parem kasutada teist varianti. Sest see on väga lihtne ja ulatus on serveritasandil. Teise lahenduse kasutuselevõtt mõjutab kõiki selle teenuse instantsi andmebaase.
|