Spalte kopieren aus anderer Datenbank

Dimitri

Neuer Benutzer
Beiträge
4
Hallo zusammen,

ich bin neu hier und habe sogut wie keine Ahnung von Sql.

Durch eigene Dummheit habe ich die Daten in der Tabelle "Bestellungpos.Auftrag" überschrieben.

Daher würde ich gerne die Daten aus der gleichen Datenbank aus der Sicherung vom Vortag wieder herstellen. (Aber wirklich nur die eine Spalte "Auftrag")

Ich habe schon ne weile gegoogelt und auch mein Buch hat leider nichts gebracht. Ich denke es kann nicht wirklich viel sein wenn man sich auskennt.

Also hier nochmal mein Problem.

Datenbank alt (eine rücksicherung mit daten die ich brauche)
Datenbank neu (aktuelle Datenbank mit falschen inhalt)

Ich brauche die Daten aus:
Datenbank "alt"
Tablle "Bestellungpos"
Spalte "auftrag"

Die Daten sollen die Daten in der Datenbank "neu" ersetzen.
Datenbak "neu"
Tablle "Bestellungpos"
Spalte "auftrag"

Schonmal danke im Vorraus
Gruß Dimitri
 
Werbung:

ukulele

Datenbank-Guru
Beiträge
4.702
So einfach wie du es dir vorstellst ist es dann doch nicht. Es gibt Sicherungsprogramme wie z.B. Symantec die mit GRT Technik auch SQL Datensätze widerherstellen können, sowas habe ich aber auch noch nicht gemacht.

Wichtig sind zunächst mal 3 Dinge.

1) Wie liegt das Backup vor? Läuft derzeit ein zweiter SQL Server der den alten Datenbestand abbildet oder wie möchtest du an die Daten kommen?

2) Sind seit dem Backup Änderungen an der Tabelle vorgenommen worden die erhalten bleiben müssen?

3) Mit welchen anderen Tabellen ist Bestellungpos per Fremdschlüssel verbunden? Auch wenn eventuell keine Constraints, also Bedingungen für Fremdschlüssel angelegt sind so sind diese doch durch den Aufbau der DB für das Programm oft wichtig und müssen eingehalten werden.
 

Dimitri

Neuer Benutzer
Beiträge
4
Wow das war ja ne schnelle Antwort.

zu 1:
Ich mache um 9:00 und 12:00 je ein Backup auf ein anderes System.
Ich habe das 12:00 Backup vom Vortag unter anderen Datenbank Namen "neu" wieder hergestellt.
Die Daten in diesem Backup sind ok.

zu2:
ja in den 2 Tagen sind neue Einträge dazugekommen die ich behalten müsste.

zu3:
bei der Frage muss ich leider passen.


Meine Idee wär etwa so in der der art.
Leider funktioiert sie nicht.

update bestellungpos
set neu.bestellungpos.auftrag = alt.bestellung.status
where neu.bestellungpos.auftrag <> alt.bestellungpos.auftrag

wo nur die Daten die abweichend sind überschrieben würden.
Gruß Dimitri
 

ukulele

Datenbank-Guru
Beiträge
4.702
Okay also zunächst mal brauchst du einen Verbindungsserver um in einem Query beide Tabellen, also die auf dem aktiven System und die auf dem Wiederhergestellten System abfragen zu können.

Dann musst du in der Lage sein, alle fehlerhaften Datensätze zu erkennen. Also wenn wirklich nur die Spalte auftrag betroffen ist und alle Datensätze als solche noch in der Tabelle stehen (oder sind welche gelöscht worden?) dann wäre es halbwegs einfach.

PS: Ein eindeutiger Primärschlüssel wäre natürlich enorm hilfreich.
 

akretschmer

Datenbank-Guru
Beiträge
9.736
Wow das war ja ne schnelle Antwort.



Meine Idee wär etwa so in der der art.
Leider funktioiert sie nicht.

update bestellungpos
set neu.bestellungpos.auftrag = alt.bestellung.status
where neu.bestellungpos.auftrag <> alt.bestellungpos.auftrag

wo nur die Daten die abweichend sind überschrieben würden.
Gruß Dimitri

Du stellst Dir das scheinbar wirklich zu einfach vor. Zum einen willst Du Auftrag mit Status überschreiben. Auftrag sind hier wohl Auftragsnummerm, also, 1,2,3. Und Status sowas wie 'bestellt', 'geliefert', 'bezahlt'. Vielleicht nicht wirklich das, was Du willst. Auch Dein WHERE scheint nicht wohl überlegt zu sein: angenommen Du hast die Aufträge 1,2,3,4,5 sowohl in neu als auch in alt. Da paßt nun zu Auftrag nr. 1 in neu alles aus alt mit Nummer 2,3,4 und 5. Du könntest Deine Tabelle wohl schneller mit einem Zufallsgenerator füllen.

Hint: ein Restore nur einer Spalte ist nicht so trivial wie es erscheint. Sehr wahrscheinlich willst Du ja nachher ein konsistentes System haben. Sehr wahrscheinlich wäre es das beste du würdest ein zeitnahes backup KOMPLETT einspielen.
 

Dimitri

Neuer Benutzer
Beiträge
4
Okay also zunächst mal brauchst du einen Verbindungsserver um in einem Query beide Tabellen, also die auf dem aktiven System und die auf dem Wiederhergestellten System abfragen zu können.

Dann musst du in der Lage sein, alle fehlerhaften Datensätze zu erkennen. Also wenn wirklich nur die Spalte auftrag betroffen ist und alle Datensätze als solche noch in der Tabelle stehen (oder sind welche gelöscht worden?) dann wäre es halbwegs einfach.

PS: Ein eindeutiger Primärschlüssel wäre natürlich enorm hilfreich.



update bestellungpos
set neu.bestellungpos.auftrag = alt.bestellung.auftrag <---- muss natürlich auftrag sein nicht status.
where neu.bestellungpos.auftrag <> alt.bestellungpos.auftrag


Ja, die Daten sind im Backup alle vorhanden. Der Primäre Schlüssel ist "Bestellung"


Wie geht das mit dem Verbindungsserver. Wenn ich Query Analyzer aufrufe, kann ich oben einstellen ob ich auf die Datenbank "alt" oder "neu" zugreifen kann.
 

ukulele

Datenbank-Guru
Beiträge
4.702
Achso du hast keinen 2ten DB Server nur eine 2te Datenbank auf dem selben Server. Dann müsste es so gehen.

Welches Format / Länge haben die Spalten auftrag und Bestellung? Ist der PK irgendwie ein fortlaufender Integer oder ein UniqueKey?
 

Dimitri

Neuer Benutzer
Beiträge
4
Hallo,
erstmal wollte ich mich nochmal bei allen für die Hilfe bedanken.

Ich habe die Lösung nun und möchte sie auch mit euch teilen, falls wer ein ähnliches Problem hat.

Im Query Analyzer muss man auf die Datenbank die aktualisiert werden soll wechseln.
im Innerjoin wird dann die Sicherung genommen.

Mein Fehler war das ich nur einen Punkt "." vor dem Tabellen Namen benutzt hatte. Mit 2 Punkten ".."klappt es wunderbar.

-----------------------------------------
update z
set z.kl_auftrag=q.kl_auftrag
from bestellungpos z
inner join Datenbansicherung..bestellungpos q on q.bestellung=z.bestellung and q.position=z.position
go
-----------------------------------------
Gruß Dimitri
 
Werbung:

ukulele

Datenbank-Guru
Beiträge
4.702
Ich hätte es Zeilenweise gemacht um Problemen vorzubeugen oder z.B. die Ausführung irgendwelcher Trigger nicht zu unterbinden. Außerdem hätte ich versucht nur Datensätze anzufassen die definitiv fehlerhaft sind und nicht alle.
 
Oben