Wie werden zwei Datenbanken in SQL Server zusammengeführt?

8

Beide Datenbanken haben dasselbe Schema, können jedoch in einigen Tabellen Konflikte mit dem Primärschlüssel aufweisen. Daher möchte ich, dass sie die doppelten Zeilen ignorieren und weiter zusammenführen.

    
Ish Kumar 27.04.2010, 17:37
quelle

6 Antworten

7

Zuerst zeigt ein Schlüsselkonflikt an, dass jeder Prozess, den Sie gerade verwenden, ein schlechter ist.

Um zwei Datenbanken korrekt zusammenzuführen, die automatisch generierte (non_GUID) Schlüssel verwenden, müssen Sie mehrere Schritte ausführen. Fügen Sie zuerst einen neuen automatisch generierten Schlüssel zur übergeordneten Tabelle hinzu, importieren Sie dann alle Daten aus beiden Tabellen, benennen Sie die alte alte Datei in ID_old um und benennen Sie die neuen Dateien in den alten ID-Namen um. An diesem Punkt können Sie dann die untergeordneten Tabellen verschieben. Sie müssen in untergeordnete Tabellen kopieren, indem Sie sich der übergeordneten Tabelle anschließen und das neue ID-Feld als Wert für den Fremdschlüssel anstelle des in der vorhandenen Tabelle verwenden. Sie müssen diesen Prozess für jede Fremdschlüsseltabelle wiederholen, und wenn diese Tabelle auch eine Elterntabelle ist, müssen Sie vor dem Kopieren von Daten das Feld "ConversionID" zur Tabelle hinzufügen, damit Sie die gesamte Kette durcharbeiten können . Um dies richtig zu machen, ist viel Wissen über die Struktur der Datenbank und viel Planung erforderlich. Erwägen Sie dies nicht ohne eine gute Sicherung beider Quelldatenbanken. Es ist auch am besten, wenn der Prozess stattfinden kann, wenn beide Dateien im Einzelbenutzermodus sind.

Wenn Sie natürliche Schlüssel verwenden und Duplikate haben, haben Sie ein ganz anderes Problem. Alle doppelten Schlüsseldatensätze sollten zuerst in eine separate Tabelle verschoben werden, und es sollte bestimmt werden, welche die korrekeren Daten sind. In einigen Fällen werden Sie feststellen, dass der natürliche Schlüssel in der Tat nicht einzigartig ist (sie sind selten, weshalb ich sie fast nie benutze) und die zusammengeführte Datenbank muss mit einem automatisch generierten Schlüssel eines Typs arbeiten. Dies wird sowohl Codeänderungen als auch Datenbankänderungen mit sich bringen, daher ist es die letzte Möglichkeit.

Was Sie oft mit natürlichen Schlüsseln finden, ist, dass die Daten für jedes anders sind, aber ähnlich (St. vice Street in der Adresse) in diesem Fall markieren Sie einen der Datensätze für Einfügen und dann, wenn Sie den Einsatz in zwei Schritten tun, zuerst die Datensätze, die keine Duplikate enthalten, dann die Datensätze in der Duplikatentabelle, die zum Einfügen markiert sind. Denken Sie daran, dass Sie alle Datensätze in allen Fremdschlüsseltabellen untersuchen müssen, um zu entscheiden, welche beibehalten und welche nicht beibehalten werden sollen. Es ist eine schlechte Idee, irgendwelche Duplikate einfach wegzuwerfen, und Sie werden auf diese Weise Daten verlieren, möglicherweise kritische Daten (wie die Bestellungen eines Kunden). Dies ist ein langwieriger Prozess, der erfordert, dass jemand mit Erfahrung in den Daten die Bestimmungen trifft. Als Programmierer sollten Sie ihnen ein Deduplizierungswerkzeug zur Verfügung stellen, mit dem sie alle Daten für jede Gruppe von Duplikaten untersuchen und auswählen können, was sie behalten und was sie loswerden sollen. Anschließend müssen sie einen Prozess zum Einfügen der Datensätze ausführen . Denken Sie in Ihrem Entwurf daran, dass es für echte Duplikate einige untergeordnete Tabellen (wie Bestellungen) gibt, die die Datensätze von beiden an die Datenbank für den Datensatz benötigen, der als der eingegebene Datensatz ausgewählt wurde (Bestellungen sind ein Beispiel), für andere Tabellen Sie wollen wählen, was korrekt ist (Adresse zum Beispiel). Sie sehen also, dass dies ein komplexer Prozess ist, der ein gründliches Verständnis der Datenbank erfordert.

Wenn Sie viele Duplikate haben, bereinigen sie möglicherweise die Daten und fügen sie für mehrere Monate hinzu, so dass ein Tool wirklich kritisch ist. Die Leute, die dies tun, werden wahrscheinlich Systembenutzer sein, keine Datenbankspezialisten oder Programmierer, da sie die einzigen Leute sind, die wirklich das Urteil über den Datensatz treffen können. Wahrscheinlich müssen Sie in jedem Fall etwas Ähnliches tun, da es Datensätze geben kann, die Duplikate sind, selbst wenn Sie einen automatisch generierten Schlüssel haben. Sie sind nur schwieriger zu finden.

Es gibt keine einfache Möglichkeit, zwei Datenbanken zusammenzuführen (selbst mit GUIDS haben Sie das Problem von Duplikaten im natürlichen Schlüssel).

    
HLGEM 26.05.2009, 13:58
quelle
5

Ich weiß, dass dies ein altes Thema ist, aber ich muss den allgemeinen Ansatz kommentieren, den ich in vielen Beiträgen sehe und der versucht, alles nativ mit SQL-Abfragen zu machen. Was diese Lösungen gemeinsam haben, ist die ziemlich lange Zeit, die für das Erstellen und Testen einer Abfrage benötigt wird, bevor sie angewendet wird.

Also ja - Sie können zwei Datenbanken nativ mit relativ komplexen Abfragen zusammenführen, aber Sie können sich eine Menge Zeit sparen und Tools von Drittanbietern kostenlos nutzen (die meisten oder alle haben eine voll funktionsfähige kostenlose Testversion).

Es gibt Tonnen davon auf dem Markt. Red Gate, bereits in anderen Post erwähnt, ist einer der besten, aber Sie können auch ApexSQL Data Diff , dbForge , SQL Comparison Toolset und viele andere.

    
Monte Chavis 24.07.2013 11:25
quelle
4

Die beste Wette wäre wahrscheinlich mit einer Anwendung von Drittanbietern wie RedGate SQL Data Compare . Kostet etwas Geld, aber es lohnt sich, dieses Skript IMO zu schreiben.

    
Gromer 26.05.2009 08:22
quelle
1

Hier ist, wie ich das in den letzten Jahren zweimal gemacht habe: Ссылка

    
Anubis 27.05.2016 08:57
quelle
0

Wenn Sie Primärschlüssel als IDENTITY haben, ist hier mein Vorschlag (sollte das Schema nicht ändern).

  1. Richten Sie alle Fremdschlüssel so ein, dass ON UPDATE CASCADE auf
  2. gesetzt ist
  3. Aktualisieren Sie das Primärschlüssel- / IDENTITY-Feld in der Elterntabelle und fügen Sie den Maximalwert des Feldes der entsprechenden Tabelle hinzu, in die Sie einfügen möchten (die FKs kaskadieren dann die Werte zu den Kindtabellen)
  4. Machen Sie dasselbe für die PK / IDENTITY-Felder in den untergeordneten Tabellen
  5. Folgen Sie dem Vorschlag von dieser Forumantwort und verwenden Sie SET IDENTITY_INSERT ON / OFF auf jeder Seite des Einfügens von jedem die Tabellen, beginnend mit der übergeordneten Tabelle und dann weiter zu den untergeordneten Tabellen
icc97 27.04.2010 17:34
quelle
0

Sie könnten einfach ein zusätzliches Feld (z. B. DatabaseID) zu allen Tabellen in Ihrer zusammengeführten Datenbank hinzufügen und es zu den Primärschlüsseln hinzufügen. Auf diese Weise können Sie die ursprünglichen Schlüssel beibehalten, während eindeutige Schlüssel in der zusammengeführten Datenbank vorhanden sind - und Sie können feststellen, aus welcher Datenbank die Zeile stammt. Dies ist, was SQL-Hub tut - wenn es sich nur um einen einmaligen Job handelt, können Sie dies mit der kostenlosen Testversion machen .

    
Alan Hickman 11.02.2016 10:28
quelle