Úvod
Od vydání SQL Server 2012, když je instance SQL Server restartována, hodnota sloupce automatického růstu tabulky skočí a konkrétní hodnota skoku je určena datovým typem sloupce růstu. Pokud je datový typ int, hodnota skoku je 1000, a pokud je typ dat bigint, hodnota skoku je 10000. Z našeho projektu je tento problém s přeskakováním nepřijatelný, zvlášť když se projevuje na straně klienta. Tento zvláštní problém se vyskytuje pouze v SQL Server 2012 a novějších verzích a neexistoval ve verzích před SQL Server 2012.
pozadí
Před pár dny kolega z našeho QA týmu navrhl: Hodnota sloupce samozvyšující se v naší tabulce nevysvětlitelně vzrostla o 10 000. Jinými slovy, poslední hodnota sloupce samozvyšující se v naší tabulce byla 2200, ale nyní, když jsme přidali nový rekord, hodnota sloupce se samozvyšující se zvýšila na 12200. V naší obchodní logice nejsou takové situace na klientovi povoleny, takže musíme tento problém vyřešit.
Použití kódu
Zpočátku jsme byli všichni velmi zvláštní, jak se to stalo? Obvykle ručně nevkládáme žádné hodnoty do samopřirůstajících sloupců (ruční vkládání hodnot do samonafukujících sloupců je v pořádku) a hodnoty samonafukujících sloupců jsou udržovány samotnou databází. Člen našeho hlavního týmu začal tuto otázku zkoumat a našel odpověď. Nyní bych rád podrobně vysvětlil tento problém a řešení, které našel můj kolega.
Jak tuto chybu reprodukovat
Budete muset nainstalovat SQL Server 2012 a poté vytvořit testovací databázi. Poté vytvořte tabulku se samorozrůstajícími sloupci:
Nyní vložte dvě datové části:
Projděte výsledky:
V tuto chvíli byl výsledek stejný, jak jsme očekávali. Nyní restartujte svou SQL Server službu. Existuje několik způsobů, jak restartovat SQL Service, a zde používáme SQL Server Manager k jeho restartu:
Po restartu právě teď vložíme do tabulky další 2 datové části:
Projděte výsledky:
Nyní vidíte výsledky po restartu SQL Server 2012 a jeho samozvyšující se sloupce začínají na 1002. To znamená, že jsem skočil o 1000. Jak již bylo zmíněno, pokud je přidaný datový typ bigint, jeho hodnota skoku bude 10 000.
Je to opravdu CHYBA?
Microsoft uvádí, že jde o funkci, nikoli chybu, a je užitečná v mnoha situacích. Ale v našem případě takovou funkci nepotřebujeme, protože tato samoinkrementální data jsou určena k tomu, aby byla zobrazována zákazníkům, a zákazníci se budou cítit divně, pokud uvidí taková skákající data. A hodnota skoku je určena počtem restartů SQL Serveru. Pokud tato data nejsou zákazníkům zobrazována, mohou být přijatelná. Tato funkce je proto obvykle vhodná pouze pro vnitřní použití.
řešení
Pokud nás tato "funkce" nabízená Microsoftem nezajímá, existují dva způsoby, jak ji můžeme vypnout.
1. Použití sekvencí
2. Zaregistrujte počáteční parametr -t272 pro SQL Server
Používejte sekvence
Nejprve musíme odstranit samopřirůstající sloupce tabulky. Poté vytvoříte sekvenci bez cache, ze které se vkládají číselné hodnoty. Tady je ukázkový kód:
Zaregistrujte startovací parametr -t272
Otevřete SQL Server Configuration Manager. Vyberte instanci SQL Server 2012, klikněte pravým tlačítkem a vyberte nabídku Vlastnosti. Najděte parametry spuštění v vyskakovacím okně a registrujte -t272. Po dokončení restartujte SQL Server (SQLSERVER2012) na obrázku níže a poté provedete operaci reprodukce chyb, abyste ověřili, zda byl problém vyřešen.
Další poznámky:
Pokud máte v databázi hodně samonafukujících tabulek a všechny mají problémy s číselným skokem, je lepší použít druhou možnost. Protože je to velmi jednoduché a rozsah je na úrovni serveru. Přijetí druhého řešení ovlivní všechny databáze na této instanci služby.
|