Bevezetés
Az SQL Server 2012 kiadásaitól kezdve, amikor az SQL Server példányt újraindítják, a tábla automatikus növekedési oszlopának értéke ugrik, és a konkrét ugrás értékét a növekedési oszlop adattípusa határozza meg. Ha az adattípus int, akkor az ugrás értéke 1000, ha az adattípus bigint, akkor az ugrás értéke 10000. Projektünkből ez a fajta ugrás probléma elfogadhatatlan, különösen, ha az ügyféloldalon látható. Ez a furcsa probléma csak az SQL Server 2012-ben és az újabbabbá váljon, és nem létezik az SQL Server 2012 előtti verziókban.
háttér
Néhány nappal ezelőtt egy kolléga a QA csapatunkból azt javasolta: A táblázatunk önnövekedő oszlopának értéke érthetetlen módon 10 000-rel megugrott. Más szóval, az önnövelő oszlop utolsó értéke a táblázatunkban 2200 volt, de most, hogy hozzáadtunk egy új rekordot, az önnövelő oszlop értéke 12200-ra nőtt. Üzleti logikánk szerint az ilyen helyzetek nem engedélyezettek az ügyfélnek, ezért ezt a problémát meg kell oldanunk.
Kódhasználat
Eleinte mindannyian nagyon furcsák voltunk, hogy történhetett ez? Általában nem adunk be manuálisan az önnövekvő oszlopokba (az önfelfújó oszlopokba való kézi értékek beillesztése rendben van), és az önfeltöltő oszlopok értékeit maga az adatbázis tartja fenn. A magcsapatunk egyik tagja elkezdte kutatni ezt a kérdést, és megtalálta a választ. Most szeretném részletesen elmagyarázni ezt a problémát és a kollégám által talált megoldást.
Hogyan lehet ezt a hibát reprodukálni
Telepítened kell az SQL Server 2012-t, majd tesztadatbázist kell létrehoznod. Ezután készíts egy táblázatot önnövő oszlopokkal:
Most két adatdarabot helyezz be:
Nézze át az eredményeket:
Ekkor az eredmény ugyanaz volt, amire számítottunk. Most indítsd újra az SQL Server szolgáltatásodat. Többféleképpen is újraindíthatjuk az SQL Service-t, és itt az SQL Server Managerrel indítjuk újra:
Újraindítás után még két adatdarabot helyezünk be a táblázatba most:
Nézze át az eredményeket:
Most látod az eredményeket az SQL Server 2012 újraindítása után, és az önmagát növelő oszlopértékek 1002-ről kezdődnek. Vagyis 1000-et ugrott. Ahogy korábban említettük, ha az adattípus bigint, akkor az ugróértéke 10 000 lesz.
Ez tényleg HIBA?
A Microsoft szerint ez funkció, nem hiba, és sok esetben hasznos. De nálunk nincs szükségünk ilyen funkcióra, mert ezt az öninkrementális adatot az ügyfeleknek kell megmutatni, és az ügyfelek furcsán érezhetik magukat, ha ilyen ugró adatokat látnak. Az ugrás értékét pedig az határozza meg, hányszor indítod újra az SQL Servert. Ha ezeket az adatokat nem mutatják meg az ügyfeleknek, az elfogadható lehet. Ezért ez a funkció általában csak belső használatra alkalmas.
megoldás
Ha nem érdekel minket ez a Microsoft által kínált "funkció", kétféleképpen is kikapcsolhatjuk.
1. Szekvenciák használata
2. Regisztrálja az indítási paramétert -t272 SQL Server számára
Szekvenciák használata
Először is el kell távolítanunk a táblázat önnövekező oszlopait. Ezután létrehozunk egy sorozatot gyorsítótár nélkül, amelyből a numerikus értékek kerülnek be. Íme a mintakód:
Regisztrálja a -t272 indítási paramétert
Nyisd meg SQL Server konfigurációkezelőt. Válaszd ki az SQL Server 2012 példányodat, kattints jobbra, és válaszd a Tulajdonságok menüt. Keresd meg az indítási paramétereket a felugró ablakban, és regisztráld a -t272-t. A befejezés után újraindítsa az alábbi ábrán látható SQL Server (SQLSERVER2012-t, majd hajtsa végre a hibareprodukciós műveletet, hogy ellenőrizze, megoldódott-e a probléma.
További megjegyzések:
Ha sok önfeltöltő tábla van az adatbázisban, és mindegyikben numerikus ugrás problémái vannak, akkor jobb, ha a második opciót választod. Mert nagyon egyszerű, és a hatótáv szerver-szintű. A második megoldás elfogadása az összes adatbázist érinti ezen a szolgáltatási példányon.
|