Ievads
Sākot ar SQL Server 2012 laidieniem, restartējot SQL Server instanci, tabulas automātiskās palielināšanas kolonnas vērtība tiek pārlēkta un konkrēto lēciena vērtību nosaka izaugsmes kolonnas datu tips. Ja datu tips ir int, lēciena vērtība ir 1000, un, ja datu tips ir bigint, lēciena vērtība ir 10000. No mūsu projekta šāda veida lēciena problēma ir nepieņemama, it īpaši, ja tā tiek parādīta klienta pusē. Šī dīvaina problēma ir tikai SQL Server 2012 un jaunākās versijās, un tā nepastāv versijās pirms SQL Server 2012.
fons
Pirms dažām dienām kolēģis no mūsu QA komandas ieteica: Mūsu tabulas pašpalielinošās kolonnas vērtība neizskaidrojami palielinājās par 10 000. Citiem vārdiem sakot, pēdējā pašpalielinošās kolonnas vērtība mūsu tabulā bija 2200, bet tagad, kad esam pievienojuši jaunu ierakstu, pašpalielinošās kolonnas vērtība ir kļuvusi par 12200. Mūsu biznesa loģikā klientam šādas situācijas nav atļautas, tāpēc mums šī problēma ir jāatrisina.
Koda izmantošana
Sākumā mēs visi bijām ļoti dīvaini, kā tas notika? Mēs parasti manuāli neievietojam nekādas vērtības pašpalielinošās kolonnās (manuāli ievietot vērtības pašpiepūšamās kolonnās ir labi), un pašpiepūšamo kolonnu vērtības uztur pati datu bāze. Mūsu pamatkomandas loceklis sāka pētīt šo jautājumu un atrada atbildi. Tagad es gribētu detalizēti izskaidrot šo problēmu un kolēģa atrasto risinājumu.
Kā reproducēt šo kļūdu
Jums būs jāinstalē SQL Server 2012 un pēc tam jāizveido testa datu bāze. Pēc tam izveidojiet tabulu ar pašaugošām kolonnām:
Tagad ievietojiet divus datus:
Pārskatiet rezultātus:
Šajā brīdī rezultāts bija tāds pats, kā mēs gaidījām. Tagad restartējiet SQL Server pakalpojumu. Ir vairāki veidi, kā restartēt SQL pakalpojumu, un šeit mēs izmantojam SQL Server Manager, lai to restartētu:
Pēc restartēšanas mēs tabulā ievietojam vēl 2 datu gabalus:
Pārskatiet rezultātus:
Tagad jūs redzat rezultātus pēc SQL Server 2012 restartēšanas, un tā pašpieaugošās kolonnas vērtības sākas ar 1002. Tas ir, pārlēca 1000. Kā minēts iepriekš, ja pievienotais datu tips ir bigint, tā lēciena vērtība būs 10 000.
Vai tas tiešām ir BUG?
Microsoft norāda, ka šī ir funkcija, nevis kļūda, un tā ir noderīga daudzos scenārijos. Bet mūsu gadījumā mums šāda funkcija nav nepieciešama, jo šie pašpieaugošie dati ir paredzēti, lai parādītu klientiem, un klienti jutīsies dīvaini, ja redzēs šādus lēciena datus. Un lēciena vērtību nosaka SQL Server reižu skaits. Ja šie dati netiek parādīti klientiem, tas var būt pieņemami. Tāpēc šī funkcija parasti ir piemērota tikai iekšējai lietošanai.
šķīdums
Ja mūs neinteresē šī Microsoft piedāvātā "funkcija", ir divi veidi, kā to izslēgt.
1. Secību izmantošana
2. Reģistrējiet startēšanas parametru -t272 SQL Server
Secību izmantošana
Pirmkārt, mums ir jānoņem tabulas pašpalielinošās kolonnas. Pēc tam izveidojiet secību bez kešatmiņas, no kuras tiek ievietotas skaitliskās vērtības. Tālāk ir norādīts koda paraugs.
Reģistrējiet startēšanas parametru -t272
Atveriet SQL Server konfigurācijas pārvaldnieku. Atlasiet SQL Server 2012 instanci, noklikšķiniet ar peles labo pogu un atlasiet izvēlni Rekvizīti. Uznirstošajā logā atrodiet palaišanas parametrus un reģistrējieties -t272. Pēc pabeigšanas restartējiet SQL Server (SQLSERVER2012) zemāk redzamajā attēlā un pēc tam veiciet kļūdu reproducēšanas operāciju, lai pārbaudītu, vai problēma ir novērsta.
Papildu piezīmes:
Ja jūsu datu bāzē ir daudz pašpiepūšamo tabulu un tām visām ir skaitliskas lēciena problēmas, tad labāk ir izmantot otro iespēju. Jo tas ir ļoti vienkārši, un darbības joma ir servera līmenī. Otrā risinājuma pieņemšana ietekmēs visas datu bāzes šajā pakalpojuma instancē.
|