herbrich19
Goto Top

SQL Server Identity Column (ID) Manipulieren

Gepriesen sei Das Rauhe Haus,

Eine Microsoft SQL Datenbank ist kaputt gegangen und konnte mit DBCC wieder zum laufen gebracht. Stichwort REPAIR_ALLOW_DATA_LOSS, nun möchte ich den einzigen verlorenen Eintrag wiederherstellen. Die ID ist jedoch automatisch Generiert. Es MUSS aber die ID 3 sein. Alle verwandten Einträge aus Beziehungen sind noch vorhanden und verweisen auf eben diesen Eintrag. Dies führt in übrigen auch dazu das die Software hängt.

Den Eintrag könnte ich mit Visual Studio manuell neu erstellen. Jedoch generiert der SQL Server in diesen Fall einfach eine neue ID. Die Idee das automatische generieren einer ID vorübergehend abzuschalten erfordert in MSSQL Managmand Studio das komplette neu erstellen der Tabelle was nicht geht weil dann auch alle restlichen Daten weg sind, und Visual Studio geht in ein Timeout wenn ich die Änderungen an der DB abspeichern will. In Visual Studio 2010 habe ich einfach die Eigenschaft Identitätsspezifikation (Is Identity) auf Nein (False) gestellt was es mir erlaubt das Feld manuell zu editieren und wenn alles wieder beim alten ist alles wieder auf Ja (True) zurück zu setzen und die Datenbank wäre somit wieder OK.

Hoffe wir können die Lösung zusammen finden.

Also in dem Sinne Danke im Vorraus und Gruß an die IT Welt face-wink
LG, J Herbrich

Content-Key: 2726250683

Url: https://administrator.de/contentid/2726250683

Printed on: April 27, 2024 at 10:04 o'clock

Member: Mystery-at-min
Mystery-at-min May 09, 2022 at 04:24:12 (UTC)
Goto Top
Tendenziell Export der DB, Manipulation der Exportdatei, import.
Member: MirkoKR
MirkoKR May 09, 2022 at 07:01:39 (UTC)
Goto Top
Da bleibt dir wohl tatsächlich nur, den Eintrag mit neuer ID zu erstellen und in den referenzierten Tabellen die Referenz von 3 auf die neue ID zu setzen..

Blöd gelaufen face-wink
Member: akretschmer
akretschmer May 09, 2022 at 08:55:00 (UTC)
Goto Top
Hier kann man OVERRIDING SYSTEM VALUE nutzen:

postgres=# create table herbrich19(id int generated always as identity primary key, data text);
CREATE TABLE
postgres=# insert into herbrich19 (data) values ('line 1'); 
INSERT 0 1
postgres=# insert into herbrich19 (data) values ('line 2'); 
INSERT 0 1
postgres=# insert into herbrich19 (data) values ('line 3'); 
INSERT 0 1
postgres=# insert into herbrich19 (data) values ('line 4'); 
INSERT 0 1
postgres=# select * from herbrich19;
 id |  data  
----+--------
  1 | line 1
  2 | line 2
  3 | line 3
  4 | line 4
(4 rows)

postgres=# delete from herbrich19 where id = 3;
DELETE 1
postgres=# insert into herbrich19 values (3, 'line 3'); 
ERROR:  cannot insert a non-DEFAULT value into column "id"  
DETAIL:  Column "id" is an identity column defined as GENERATED ALWAYS.  
HINT:  Use OVERRIDING SYSTEM VALUE to override.
postgres=# insert into herbrich19 overriding system value values (3, 'line 3'); 
INSERT 0 1
postgres=#

Vielleicht hilft es ja. Davon abgesehen sind Deine Daten jetzt nicht konsistent. Ich würde eher auf ein Backup zurückgreifen.
Member: MadMax
MadMax May 09, 2022 at 18:22:59 (UTC)
Goto Top
Hallo J Herbrich,

ein Update geht zwar nicht, aber Du kannst den Datensatz neu einfügen mit der richtigen ID:
set identity_insert <Tabelle> on
insert into <Tabelle> ...
set identity_insert <Tabelle> off

Gruß, Mad Max
Member: Herbrich19
Herbrich19 May 23, 2022 at 18:11:13 (UTC)
Goto Top
Gepriesen sei Das Rauhe Haus,

Guten Abend liebe Kollegen,

Ich habe den besagten Eintrag jetzt mit der richtigen ID neu erstellt, jetzt stürzt das gesammte Programm wieder ab. Die Datenbank ist aber jetzt so gesehen in Ordnung. Die Abfrage der Daten in Visual Studio 2010 funktioniert mehr oder weniger ok. Zwischendurch gibt es aber connection timeouts.

LG, J Herbrich