Identitätsspalte zurücksetzen

by wolfgang@gehirnwindung.de (Wolfgang) April 16, 2009 18:44

Manchmal kommt es vor, dass man (z.B. nach letzten Tests) seine Daten aus Tabellen löschen und dabei entsprechende Identitätsspalten zurücksetzen will.

Hierbei gibt es mehrere Möglichkeiten. Man kann z.B. mittels TRUNCATE TABLE gleich beides auf einmal erledigen. Das empfiehlt sich aber nicht wirklich, da dies spätestens dann aufhört, wenn die Tabelle repliziert wird oder Foreign Keys gesetzt sind. Die Replikation kann auch dafür verantwortlich sein, dass man eine Tabelle nicht einfach so löschen und neu anlegen kann.

Mit all diesen Versuchen kann man aber - wenn Sie denn überhaupt gelingen - immer nur ganz von vorne anfangen. Es müssen alle Daten gelöscht werden. Falls Daten erhalten bleiben sollen, müssen diese zuerst gelöscht und danach wieder eingefügt werden.

Aber es gibt natürlich noch eine andere Möglichkeit. Der Befehl

DBCC CHECKIDENT ('table'[, NORESEED|RESEED[, seed_value]] )

ist zwar nicht sonderlich bekannt, wird aber durchaus verwendet. Dennoch, auch DBCC CHECKIDENT hat so seine Tücken. Zum Einen werden neu erstellte und bereits verwendete Tabellen unterschiedliche behandelt. Dadurch fällt es wiederum etwas schwerer, DBCC CHECKIDENT innerhalb eines Scripts zu verwenden.

Weitaus schwerwiegender ist aber, dass man mit diesem Befehl auch doppelte Identitätswerte schaffen kann. Wenn man seed_value so setzt, dass einer der nächsten Werte ein bereits vorhandener ist, dann kommt es zu einem Fehler oder eben zumindest zu doppelten Werten (was nicht mehr viel mit Identity zu tun hat).

Daher hab ich eine Stored Procedure geschrieben, die genau diese Aufgaben übernimmt. Der Identitätswert wird auf den Ursprungswert (wie in CREATE TABLE angegeben) zurückgesetzt. Wenn allerdings bereits Daten vorhanden sind, dann wird der größte Wert verwendet. So kann es nicht zu doppelten Werten kommen und der nächste Wert ist immer der Kleinstmögliche. Dabei wird auch die wahrscheinlich selten verwendete ID-Schrittweite beachtet.

Neu erstellte Tabellen (oder eben die, die mit TRUNCATE TABLE gelöscht wurden) werden ignoriert - die sind ja bereits auf dem Ursprungswert.

Download (1,42 kB)

Will man diese Prozedur global (d.h. in allen Datenbanken) verfügbar machen, so muss man diese SP in der master-Datenbank erstellen und mittels sp_ms_marksystemobject kennzeichnen (detaillierter beschrieben im Artikel Globale Stored Procedure im SQL Server).

Kommentare

Kommentare sind geschlossen

Powered by BlogEngine.NET 1.6.1.6
Theme by Mads Kristensen | Modified by Mooglegiant and me ;)