Fehlermeldung: Arithmetischen Überlauf Datentyp Int IDENTITY umwandeln

~ 0 min
25.08.2021 08:19

Hinweis:

Dieser Artikel betrifft nur AG-VIP SQL Versionen 1.52.001 und älter. Ab der Version 2.00.001 ist dieser Vorgang für die tblLocks direkt integriert.

Beschreibung:
Jeder Eintrag in einer Tabelle, bekommt eine fortlaufende ID zugewiesen.
Diese ID hat den Datentyp INT und ist daher auf einen maximalen Wert von 2147483647 begrenzt.
Auch wenn ein Eintrag aus der Tabelle gelöscht wird und somit die ID wieder zur Verfügung stehen würde, wird diese nicht neu vergeben.
Theoretisch kann dieses Problem nur bei Tabellen auftreten, bei denen häufig Daten hinzugefügt und wieder gelöscht werden.
Ein Beispiel dafür ist die AG-VIP SQL Tabelle tblLocks.
Diese wird jedoch automatisch über den Backendservice regelmäßig bezüglich der IDENTITY zurückgesetzt.
Den aktuellen IDENTITY Wert kann man mit folgender Abfrage auf dem SQL-Server Managementstudio erhalten:

DBCC CHECKIDENT(<TabellenName>, NORESEED)

Lösung:
Auf der betroffenen Tabelle muss der IDENTITY Wert zurückgesetzt werden.
Dies kann durch folgende Abfrage auf dem SQL-Server Managementstudio erfolgen:

DBCC CHECKIDENT (<TabellenName>, RESEED, 1)

Wenn man dies über z.B. einen SQL-Job oder Hintergrundprozess regelmäßig durchführen möchte,
kann man dies abhängig von dem aktuellen kleinsten und größten ID-Wert abfragen z.B.
Kleinster Wert ist größer/gleich als: 1.879.048.192
Größter Wert ist größer/gleich als: 2.130.706.432
Dadurch ist gewährleistet, dass das Limit nicht erreicht wird und auch keine ID erneut vergeben wird, die eventuell noch in Benutzung ist.

IF (SELECT MIN([Id]) FROM <TabellenName>)>0x70000000 AND (SELECT MAX([Id]) FROM <TabellenName>)>0x7F000000 DBCC CHECKIDENT (<TabellenName>, RESEED, 1)

Hinweis:
Es ist zu beachten, dass dies nur möglich ist bei Tabellen, bei denen die Inhalte nach einer gewissen Zeit gelöscht werden.
Sollte die Tabelle Einträge besitzen die nie gelöscht werden, so ist es nicht möglich den IDENTITY Wert zurückzusetzen.
In so einem Fall ist es jedoch unrealistisch, dass das Limit von INT also 2147483647 erreicht wird.
Denn in der Regel erreichen Tabellen mit Einträgen die nicht nach einer bestimmten Zeit gelöscht werden,
Nie einen Wert der diesem Limit nahe kommt.

Durchschnittliche Bewertung 0 (0 Abstimmungen)

Kommentieren nicht möglich