Wprowadzenie
Począwszy od wydań SQL Server 2012, po ponownym uruchomieniu instancji SQL Server wartość kolumny automatycznego wzrostu tabeli skacze, a konkretna wartość skoku jest określana przez typ danych kolumny wzrostu. Jeśli typ danych to int, wartość skoku wynosi 1000, a jeśli typ danych jest bigint, wartość skoku wynosi 10000. Z naszego projektu wynika, że tego typu problem skakania jest nie do przyjęcia, zwłaszcza gdy pojawia się po stronie klienta. Ten dziwny problem występuje tylko w SQL Server 2012 i późniejszych, a nie występuje w wersjach sprzed SQL Server 2012.
tło
Kilka dni temu kolega z naszego zespołu QA zasugerował: Wartość kolumny samozwiększającej się w naszej tabeli niewytłumaczalnie wzrosła o 10 000. Innymi słowy, ostatnia wartość kolumny samoprzyrastających w naszej tabeli wynosiła 2200, ale teraz, gdy dodaliśmy nowy rekord, wartość kolumny samoprzyrastających wzrosła do 12200. W naszej logice biznesowej takie sytuacje nie są dozwolone na klientze, więc musimy rozwiązać ten problem.
Użycie kodu
Na początku wszyscy byliśmy bardzo dziwni, jak to się stało? Zazwyczaj nie wstawiamy ręcznie żadnych wartości do kolumn samoprzyrastających (ręczne wprowadzanie wartości do kolumn samonapompowujących jest w porządku), a wartości kolumn samoinflujących są utrzymywane przez samą bazę danych. Członek naszego głównego zespołu zaczął badać to pytanie i znalazł odpowiedź. Teraz chciałbym szczegółowo wyjaśnić ten problem oraz rozwiązanie, które znalazł mój kolega.
Jak odtworzyć ten błąd
Będziesz musiał zainstalować SQL Server 2012, a następnie stworzyć testową bazę danych. Następnie stwórz tabelę z kolumnami samorosnącymi:
Teraz wstaw dwa dane:
Przejrzyj wyniki:
W tym momencie efekt był taki sam, jak się spodziewaliśmy. Teraz zrestartuj usługę SQL Server. Istnieje kilka sposobów na ponowne uruchomienie SQL Service, a tutaj używamy SQL Server Managera do jego ponownego uruchomienia:
Po ponownym uruchomieniu właśnie wstawiliśmy do tabeli jeszcze 2 dane:
Przejrzyj wyniki:
Teraz widzisz wyniki po ponownym uruchomieniu SQL Server 2012, a jego samoprzyrastające wartości kolumn zaczynają się od 1002. To znaczy, skoczył o 1000. Jak wspomniano wcześniej, jeśli dodany przez nas typ danych jest bigint, jego wartość skoku wyniesie 10 000.
Czy to naprawdę BŁĄD?
Microsoft twierdzi, że jest to funkcja, a nie błąd, i jest przydatna w wielu sytuacjach. Ale w naszym przypadku nie potrzebujemy takiej funkcji, ponieważ te samoprzyrostowe dane mają być pokazywane klientom, a klienci poczują się dziwnie, jeśli zobaczą takie skaczące dane. Wartość skoku zależy od liczby restartów SQL Servera. Jeśli te dane nie są pokazywane klientom, mogą być akceptowalne. Dlatego ta funkcja jest zazwyczaj odpowiednia tylko do użytku wewnętrznego.
rozwiązanie
Jeśli nie interesuje nas ta "funkcja" oferowana przez Microsoft, istnieją dwa sposoby, by ją wyłączyć.
1. Użycie sekwencji
2. Zarejestruj parametr startowy -t272 dla SQL Server
Sekwencje użycia
Po pierwsze, musimy usunąć kolumny samoprzyrastające w tabeli. Następnie tworzy sekwencję bez buforowania, z której wstawiane są wartości liczbowe. Oto przykładowy kod:
Zarejestruj parametr startowy -t272
Otwórz SQL Server Configuration Manager. Wybierz swoją instancję SQL Server 2012, kliknij prawym przyciskiem myszy i wybierz menu Właściwości. Znajdź parametry startu w oknie wyskakującym i zarejestruj -t272. Po zakończeniu uruchom SQL Server (SQLSERVER2012) na poniższym rysunku, a następnie wykonaj operację odtwarzania błędów, aby zweryfikować, czy problem został rozwiązany.
Dodatkowe notatki:
Jeśli masz w bazie danych dużo samonapompowujących się tabel i wszystkie mają problemy z przeskokami liczbowymi, lepiej użyć drugiej opcji. Bo jest bardzo prosty, a zakres jest na poziomie serwera. Przyjęcie drugiego rozwiązania wpłynie na wszystkie bazy danych na tej instancji usługi.
|