IDENTITY INSERT

ukulele

Datenbank-Guru
Beiträge
5.107
Ich bin grade in einer Migration und die Software passt im Laufe dieser die Datenbank an. Eine Tabelle kann nicht angepasst werden, vermutlich aufgrund der Menge an Daten. Die Tabelle wurde jetzt neu angelegt, die alte Tabelle liegt mir vor und ich möchte die Daten nachträglich einfügen.

Die alte Tabelle hat eine Spalte vom Typ TIMESTAMP und keinen Primary Key (nur Indexe). Die Spalte wird jetzt zum BIGINT mit IDENTITY(1,1) und Teil eines PK. Mein Plan jetzt:
1) Bereits in der neuen Tabelle entstandender Inhalt in eine weitere Temp-Tabelle schreiben und in original Tabelle löschen.#
2) SET IDENTITY_INSERT tabelle ON
Was passiert denn, wenn ich jetzt Werte niedriger als der vormals höchste IDENTITY-Wert in die Tabelle versuche einzufügen? Ich möchte gerne den TIMESTAMP zum BIGINT konvertierten und dabei wird das passieren.
3) Ursprünglichen Inhalt wieder zurück schreiben
4) SET IDENTITY_INSERT tabelle OFF

Müsste soweit gehen wenn ich das richtig verstehe. Mein problem sind die 110 Mio Datensätze, die mir etwas sorgen machen ;-)
 
Werbung:
Hab keine Praxis mit MS SQL, meine erste Idee wäre, im Ablauf irgendwann ein ALTER TABLE .. IDENTITY(<newSeed>,1) abzusetzen. So würde ich es wohl in anderen DB (mit anderer Syntax) versuchen. Hab allerdings auf die Schnelle nichts gesehen, das ein solches Vorgehen bestätigt.
Bestehende Werte und neuer Startpunkt der Werte müssen natürlich zueinander passen.

Dann frage ich mich, warum TIMESTAMP (überhaupt) >ausgetauscht< werden soll. Ich würde eher ergänzen, erst wenn (nach gesichertem Erfolg) klar ist, dass alte Daten / Formate nicht mehr benötigt werden, diese droppen. Gilt besonders bei unpraktischen Datenmengen.

Dann ist hier z.B. eine Diskussion dazu und es gibt offenbar eine Variante, große Datenmengen einfacher zu handhaben (Alter Table ..Switch), diese Antwort im Link:
 
Nunja ich habe die eigentliche Tabelle aus der alten Datenbank mit TIMESTAMP, aber die neue Tabelle wurde bereits neu angelegt. Und TIMESTAMP bei MSSQL ist kein Zeitstempel und wird automatisch generiert. Ich kann also den TIMESTAMP gar nicht in die neue Tabelle einfügen.
Ich könnte nur die alte Tabelle zur neuen machen, die TIMESTAMP Spalte umbennen und mich dann an den Änderungen versuchen. Damit fällt auch Lösungweg 1 aus dem Link weg (den kannte ich schon) und es ginge maximal mit einer neuen IDENTITY Spalte mit dem Namen der alten. Allerdings werden dann IDENTITY und der alte TIMESTAMP in keinem logischen Zusammenhang mehr stehen weil die neue IDENTITY Spalte vermutlich lückenlos durchnummeriert, das fände ich jetzt schade :)

Ich sollte das eigentlich alles testen aber aufgrund der Datenmenge fehlt mir die Zeit, ich hoffe die Transaktionslog läuft mir nicht wieder voll.
 
Werbung:
Hat wunderbar geklappt gestern nachdem ich nochmal im zweiten Anlauf 50GB spendiert habe für Transaction Log. Habs jetzt wie folgt gemacht:

1) neue Tabelle umbeannt
2) Tabelle mit Definition der neuen Tabelle neu angelegt, ohne PK oder Indexe
3) SET IDENTITY_INSERT ganz neue tabelle ON
4) alt Daten in ganz neue Tabelle geschrieben, dabei TIMESTAMP zu BIGINT konvertiert
5) neue Daten in ganz neue Tabelle geschrieben, dabei BIGINT um den maximalen Wert erhöht
6) SET IDENTITY_INSERT ganz neue tabelle OFF
7) PK und Indexe erstellt
 
Zurück
Oben