Einleitung
Ab den SQL Server 2012-Releases springt beim Neustart der Wert der Auto-Grow-Spalte der Tabelle und der spezifische Sprungwert wird durch den Datentyp der Wachstumsspalte bestimmt. Ist der Datentyp int, beträgt der Sprungwert 1000, und wenn der Datentyp bigint ist, beträgt der Sprungwert 10000. Bei unserem Projekt ist ein solches Sprungproblem inakzeptabel, besonders wenn es auf Kundenseite gezeigt wird. Dieses seltsame Problem tritt nur in SQL Server 2012 und später auf und existiert in Versionen vor SQL Server 2012 nicht.
Hintergrund
Vor ein paar Tagen schlug ein Kollege aus unserem QA-Team vor: Der Wert der sich selbst steigernden Spalte an unserem Tisch ist unerklärlicherweise um 10.000 gestiegen. Mit anderen Worten: Der letzte Wert der sich selbst inkrementierenden Spalte in unserer Tabelle war 2200, aber jetzt, da wir einen neuen Datensatz hinzugefügt haben, ist der Wert der selbstinkrementierten Spalte 12200 geworden. In unserer Geschäftslogik sind solche Situationen für den Client nicht erlaubt, daher müssen wir dieses Problem lösen.
Verwendung des Codes
Anfangs waren wir alle sehr seltsam, wie konnte das passieren? Wir fügen normalerweise keine Werte manuell in selbststeigernde Spalten ein (Werte manuell in selbstaufblasende Spalten einzufügen ist in Ordnung), und die Werte der selbstaufblähenden Spalten werden von der Datenbank selbst verwaltet. Ein Mitglied unseres Kernteams begann, diese Frage zu recherchieren und fand die Antwort. Nun möchte ich dieses Problem und die Lösung, die mein Kollege gefunden hat, im Detail erklären.
Wie man diesen Fehler reproduziert
Du musst SQL Server 2012 installieren und dann eine Testdatenbank erstellen. Erstellen Sie dann eine Tabelle mit selbstwachsenden Spalten:
Fügen Sie nun zwei Datensätze ein:
Überprüfen Sie die Ergebnisse:
An diesem Punkt war das Ergebnis dasselbe, wie wir es erwartet hatten. Starte jetzt deinen SQL Server Service neu an. Es gibt mehrere Möglichkeiten, den SQL Service neu zu starten, und hier verwenden wir den SQL Server Manager, um ihn neu zu starten:
Nach dem Neustart fügen wir gerade zwei weitere Datenstücke in die Tabelle ein:
Überprüfen Sie die Ergebnisse:
Jetzt sehen Sie die Ergebnisse nach dem Neustart von SQL Server 2012, und die sich selbst inkrementierenden Spaltenwerte beginnen bei 1002. Das heißt, um 1000 gesprungen. Wie bereits erwähnt, wenn der Datentyp, den wir hinzufügen, Biviel ist, beträgt sein Sprungwert 10.000.
Ist das wirklich ein BUG?
Microsoft erklärt, dass dies eine Funktion und kein Fehler ist und in vielen Szenarien nützlich ist. Aber in unserem Fall brauchen wir eine solche Funktion nicht, denn diese selbst-inkrementellen Daten sollen den Kunden gezeigt werden, und sie werden sich seltsam fühlen, wenn sie solche sprunghaften Daten sehen. Und der Sprungwert wird durch die Anzahl der Neustarts von SQL Server bestimmt. Wenn diese Daten den Kunden nicht angezeigt werden, könnten sie akzeptabel sein. Daher ist dieses Merkmal meist nur für den internen Gebrauch geeignet.
Lösung
Wenn wir an dieser von Microsoft angebotenen "Funktion" nicht interessiert sind, gibt es zwei Möglichkeiten, sie auszuschalten.
1. Verwendung von Sequenzen
2. Registrieren Sie den Startparameter -t272 für SQL Server
Verwenden Sie Sequenzen
Zuerst müssen wir die selbstinkrementierenden Spalten der Tabelle entfernen. Dann erstelle eine Sequenz ohne Caching, aus der die numerischen Werte eingefügt werden. Hier ist der Beispielcode:
Registrieren Sie den Startparameter -t272
Öffnen Sie den SQL Server Configuration Manager. Wählen Sie Ihre SQL Server 2012-Instanz aus, klicken Sie mit der rechten Maustaste und wählen Sie das Menü Eigenschaften. Finden Sie die Startparameter im Pop-up-Fenster und registrieren Sie -t272. Nach Abschluss starten Sie SQL Server (SQLSERVER2012) in der Abbildung unten neu und führen dann die Fehlerreproduktion durch, um zu überprüfen, ob das Problem behoben wurde.
Zusätzliche Anmerkungen:
Wenn du viele selbstaufblasbare Tabellen in deiner Datenbank hast und sie alle numerische Sprungprobleme haben, ist es besser, die zweite Option zu verwenden. Weil es sehr einfach ist und der Umfang auf Serverebene liegt. Die Einführung der zweiten Lösung wirkt sich auf alle Datenbanken auf dieser Dienstinstanz aus.
|