Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Spalte kopieren aus anderer Datenbank

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Dimitri, 8 Juli 2013.

  1. Dimitri

    Dimitri Neuer Benutzer

    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
     
  2. ukulele

    ukulele Datenbank-Guru

    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.
     
  3. Dimitri

    Dimitri Neuer Benutzer

    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
     
  4. ukulele

    ukulele Datenbank-Guru

    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.
     
  5. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  6. Dimitri

    Dimitri Neuer Benutzer



    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.
     
  7. ukulele

    ukulele Datenbank-Guru

    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?
     
  8. Dimitri

    Dimitri Neuer Benutzer

    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
     
  9. ukulele

    ukulele Datenbank-Guru

    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.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden