2009-05-26 62 views
8

Entrambi i database hanno lo stesso schema, ma potrebbero verificarsi conflitti con la chiave primaria in alcune tabelle. Quindi voglio che ignorino semplicemente le righe duplicate e continuiamo a fonderci ulteriormente.Come unire due database in SQL Server?

risposta

7

Prima un conflitto di chiavi indica che qualsiasi processo che si sta utilizzando attualmente è scadente.

Per unire correttamente due database che utilizzano chiavi autogenerate (non_GUID), è necessario eseguire diversi passaggi. Per prima cosa aggiungi una nuova chiave generata automaticamente alla tabella genitore, quindi importa tutti i dati da entrambe le tabelle, rinomina il vecchio vecchio file in ID_old e rinomina i nuovi file con il vecchio nome id. A questo punto puoi quindi spostarti sulle tabelle figlio. Sarà necessario copiare le tabelle figlio collegandosi alla tabella padre e prendendo il nuovo campo ID come valore per la chiave esterna anziché quella nella tabella esistente. Sarà necessario ripetere questa procedura per ogni tabella di chiavi esterne e se tale tabella è anche una tabella padre, sarà necessario aggiungere il campo conversionid alla tabella prima di copiare qualsiasi dato, in modo da poter lavorare fino in fondo alla catena . Per fare ciò, è necessaria una buona dose di conoscenza della struttura del database e molta pianificazione. Non considerare di farlo senza un buon backup di entrambi i database di origine. È anche meglio se il processo può accadere quando entrambe le basi sono in modalità utente singolo.

Se si utilizzano chiavi naturali e duplicati, si presenta un problema molto diverso. Tutti i record di chiavi duplicati dovrebbero essere spostati in una tabella separata prima e una deteminazione su quali sono i dati più corretti dovrebbero essere fatti. In alcuni casi scoprirai che la chiave naturale non è in effetti unica (raramente lo sono, motivo per cui quasi non li uso) e il database unito dovrà funzionare con una chiave autogenerata di qualche tipo. Ciò comporterà modifiche al codice e modifiche al database, quindi è l'opzione di ultima istanza.

Quello che si trova spesso con le chiavi naturali è che i dati per ognuno sono diversi ma simliar (St. vice Street nell'indirizzo) in questo caso contrassegnare uno dei record per l'inserimento e quindi quando fare l'inserimento in due passaggi , prima i record che non hanno duplicati, quindi i record nella tabella dei duplicati che sono contrassegnati per l'inserimento. Ricorda che dovrai esaminare tutti i record in tutte le tabelle di chiavi straniere per stabilire quale mantenere e quale non mantenere. Eliminare qualsiasi duplicato è una cattiva idea e perderete i dati in quel modo, possibilmente dati importanti (come gli ordini di un cliente). Questo è un processo lungo e noioso che richiederà a qualcuno con esperienza nei dati di effettuare le determinazioni. Come programmatore, dovresti fornire loro uno strumento di deduplica che consentirà loro di esaminare tutti i dati per ciascun set di duplicati e scegliere cosa tenere e cosa eliminare e quindi aver segnato tutto, eseguirà un processo per inserire i record . Ricordatevi che per i veri duplicati ci saranno alcune tabelle figlio (come gli ordini) che hanno bisogno dei record sia inviati al database per il record scelto come quello da inserire (gli ordini sono un esempio), per le altre tabelle vorrete scegliere quale sia corretto (indirizzo per esempio). Quindi puoi vedere che questo è un processo complesso che richiede una comprensione approfondita del database.

Se si dispone di molti duplicati, è possibile che si stiano ripulendo e aggiungendo i dati per diversi mesi, quindi uno strumento è davvero fondamentale. Le persone che fanno questo saranno probabilmente utenti di sistema non specialisti di database o programmatori in quanto sono le uniche persone che possono veramente esprimere il giudizio sulla maggior parte dei itme su quale record tenere. Probabilmente avrete bisogno di fare qualcosa di simile in ogni caso in quanto potrebbero esserci dei record che sono duplicati anche quando avete una chiave generata automaticamente. Sono solo più difficili da trovare.

Non esiste un modo semplice per unire due database (anche utilizzando GUID, si ha il problema dei duplicati nella chiave naturale).

4

La migliore scommessa sarebbe probabilmente disponibile con un'applicazione di terze parti come RedGate SQL Data Compare. Costa un po 'di soldi, ma ne vale la pena rispetto alla scrittura di questo script IMO.

+2

è che non c'è alcuna alternativa open source !!! – Ish

0

Se si dispone di chiavi primarie come IDENTITY, ecco il mio suggerimento (non dovrebbe richiedere la modifica dello schema).

  1. Impostare tutte le chiavi esterne in modo che ON UPDATE CASCADE è impostato
  2. aggiornare la chiave/IDENTITÀ campo primaria nella tabella padre e aggiungere il valore massimo del campo della tabella corrispondente che si sta per fondersi (la FKS poi a cascata i valori alle tabelle figlio)
  3. fare lo stesso per i campi PK/identità nella tabelle figlio
  4. seguire il suggerimento da this forum answer e utilizzare SET IDENTITY_INSERT ON/OFF entrambi i lati di Inserimento ognuna delle tabelle, iniziando dalla tabella padre e passando poi alle tabelle figlio
5

So che questo è un vecchio argomento ma devo commentare l'approccio generale che vedo in molti post e che sta cercando di fare tutto in modo nativo usando le query SQL. Ciò che tali soluzioni hanno in comune è la quantità di tempo abbastanza grande che deve essere spesa per creare e testare una query prima di applicarla.

Quindi sì, è possibile unire due database in modo nativo utilizzando query relativamente complesse ma è possibile risparmiare un sacco di tempo e utilizzare strumenti di terze parti gratuitamente (la maggior parte o tutti hanno una prova gratuita completamente funzionale).

Ci sono tonnellate di questi sul mercato. Red Gate, già menzionato in altri post, è uno dei migliori ma puoi anche provare ApexSQL Data Diff, dbForge, SQL Comparison toolset e molti altri.

0

Si potrebbe semplicemente aggiungere un campo aggiuntivo (denominato DatabaseID ad esempio) a tutte le tabelle nel database unito e aggiungerlo alle chiavi primarie. In questo modo è possibile mantenere le chiavi originali, pur avendo chiavi univoche nel database unito, e si può sapere da quale database è arrivata la riga. Questo è ciò che fa SQL-Hub - se si tratta di un lavoro singolo, puoi farlo con la versione di prova gratuita.