2009-03-13 5 views
4

Wir haben eine MS Access-Datenbank, die wir auf eine SQL Server-Datenbank mit einem neuen DB-Design migrieren möchten. Ein Teil der Anwendung, die die SQL Server-DB verwendet, ist bereits geschrieben.Verwenden Sie SSIS zum Migrieren und Normalisieren der Datenbank

Ich habe mich umgesehen, um herauszufinden, wie der Migrationsschritt am einfachsten durchzuführen ist, und ich habe mit Microsoft SQL Server Integration Services (SSIS) begonnen. Jetzt bin ich an den Punkt gekommen, dass ich eine Tabelle aus Gründen der Normalisierung vertikal aufteilen möchte.

Ein bezogenes Beispiel sieht wie folgt aus

MS Access-Tabelle Person

ID 
Name 
Street 

SQL Server-Tabelle Person

id 
name 

SQL Server-Tabelle Adresse

id 
person_id 
street 

Wie kann ich diese Aufgabe am besten mit SSIS erledigen? Die ID-Spalten sind Identitätsspalten (autoincrement), daher kann ich die alte ID nicht einfügen. Wie kann ich den richtigen Fremdschlüssel für Person_ID in die Adresstabelle eingeben?

Möglicherweise gibt es sogar eine Tabelle, die in drei Tabellen aufgeteilt werden muss, wobei eine Zeile in Tabelle2 zu Tabelle1 gehört und eine Zeile in Tabelle3 zu einer Zeile Tabelle2.

Ist SSIS das geeignete Mittel dafür?

EDIT Obwohl dies eine einmalige Migration, brauchen wir ein automatisiertes und wiederholbare Verfahren haben, weil die Produktionsdatenbank unter starkem Einsatz ist und wir auf der Migration in unserer Entwicklungsumgebung mit dem jüngsten arbeiten, aber nicht aktuelle Daten. Wir planen einen Testlauf der Migration und lassen den Kunden das Verhalten überprüfen. Wenn alles in Ordnung ist, werden wir für die echte Migration gehen.

Die meisten der angegebenen Lösungen enthalten viele manuelle Schritte und sind daher nicht geeignet.

Antwort

3

Verwenden Sie den Task SQL ausführen, und schreiben Sie die Anweisung selbst.

Für die Elterntabelle tun Sie Select into table from table... dann machen Sie das gleiche für den Rest, wie Sie fortschreiten. Stellen Sie sicher, dass Sie die Identität einfügen auf ON für die Elterntabelle setzen und Ihre alten IDs wiederverwenden. Das wird Ihnen helfen, Ihre Datenintegrität zu bewahren.

+0

Das ist eine gute Idee, aber wenn ich es richtig mache, muss ich zuerst die Access DB in SQL Server importieren !? Für eine SQL-Aufgabe gibt es keine Quellen- und Zielverbindung. – GrGr

+0

Ja - oft ist es besser, zuerst die Originaltabellen zu importieren und dann alle Manipulationen in SQL Server –

+0

wahr durchzuführen, also importieren Sie zuerst die Zugriffsdb, aber setzen Sie alle Tabellennamen auf etwas anderes, damit Sie sie einmal entfernen können Sie haben Ihre Daten aufgeteilt. – Eppz

3

Verwenden Sie für die Migration Ihrer Access-Tabellen in SQL Server SSMA, not the Upsizing Wizard from Access.
Sie erhalten viel mehr Werkzeuge zu Ihrer Verfügung.

Sie können dann Ihre Tabellen einzeln in SQL Server aufteilen.
Ich bin mir nicht sicher, ob es irgendwelche Werkzeuge gibt, die Ihnen helfen können, Ihre Tabellen automatisch zu teilen, zumindest konnte ich keine finden, aber es ist nicht allzu schwierig, manuell zu tun, obwohl wie viel Arbeit benötigt wird, hängt davon ab, wie Sie die verwendet haben Originaltabellen in Ihrem VBA-Code und Formulare an erster Stelle.

Eine Randnotiz

In Bezug auf Normalisierung, geht mit ihm nicht über Bord: Ich weiß, Ihr Beispiel war nur, dass aber Normalisierungskundenadressen nicht immer sind (selten?) Benötigt.

Wie viele Adressen kann eine Person haben?
Wenn Sie eine Privatadresse, eine Geschäftsadresse, eine Lieferadresse, eine Rechnungsadresse angeben, ist das wahrscheinlich das meiste, was Sie je brauchen werden.
In diesem Fall ist es besser, sie in der gleichen Tabelle zu halten. Die Normalisierung dieser Daten erfordert nur mehr Arbeit zur Rekombination und bietet keinen Nutzen.
Natürlich gibt es Fälle, in denen es Sinn machen würde, sich zu normalisieren, aber ich habe gesehen, wie Leute mit dieser Vorstellung über Bord gegangen sind (ich habe mich auch dafür schuldig gemacht) und dann Schwierigkeiten haben, komplexere Abfragen zu erstellen Diese Daten werden geteilt, was die Entwicklung und Wartung erschwert und oft eine Leistungseinbuße in Kauf nimmt.

+0

Die Randnotiz ist wahr und ich bin mir dessen bewusst. Bei den Adressen ist es umgekehrt. Wir haben fünf verschiedene Entitäten mit Adressen, die alle in der Entitätentabelle gespeichert sind. Wir wollen dies vereinheitlichen und eine einfache Kopie von Adressen zwischen Entitäten ermöglichen. – GrGr

+0

Ich habe gerade gesehen, dass mein erfundenes Beispiel vorschlägt, dass wir viele Adressen für eine Person haben wollen und nicht, dass wir eine Adresse für mehrere Entitäten haben. Aber wie du gesagt hast. Das Beispiel war genau das. – GrGr

1

Der Zugriff ist so benutzerfreundlich, warum nicht Ihre Tabellen in Access zu normalisieren, und upsize dann die fertige Struktur von dort?

+0

Wir wollen einen wiederholbaren/automatisierten Prozess für die Migration haben. Ich kann nicht sehen, wie man das in Access macht. – GrGr

+0

Access hat eine ziemlich flexible Programmiersprache, die es Ihnen ermöglicht, alles zu tun, was Sie brauchen. Natürlich könnten Sie eine andere Sprache haben, die es einfacher macht, sie in einer anderen Datenbank zu automatisieren. –

0

fand ich eine andere Lösung, die noch nicht erwähnt wurde und ermöglicht es uns, den Komfort und die Möglichkeiten der Datenfluß Aufgabe zu verwenden:

Wenn die Zieldatenbank auf einem lokalen SQL Server ist, können Sie ein verwenden Datenflusstask mit SQL Server-Ziel anstelle eines OLE DB-Ziels. Für ein SQL Server-Ziel können Sie die Option "Identitäten beibehalten" markieren. (Ich weiß nicht, ob die englischen Namen korrekt sind, weil wir eine deutsche Version haben.) Damit können Sie in Identitätsspalten schreiben

Wir haben festgestellt, dass wir die alten Primärschlüssel nicht überall verwenden können, weil wir einige Tabellen haben Nehmen Sie eine Vereinigung von Datensätzen aus mehreren Tabellen vor.

Wir beginnen den Prozess, durch eine temporäre Zuordnungstabelle Gebäude mit Säulen

new_id (identity) 
old_id (int) 
old_tablename (string) 

Wir füllen zuerst in allen old_id s für jede Tabelle, die durch einen Fremdschlüssel in dem neuen Schema verwiesen wird. Die new_id-Werte werden automatisch von SQL Server generiert.

Wir können also einen Join verwenden, um von old_id nach new_id zu übersetzen, wo es gebraucht wird. Wir verwenden die new_id-Werte, um die Identitätsspalten (Primärschlüssel) in den neuen Tabellen mit der Option "Identitäten beibehalten" zu füllen, und können sie einfach in unserer Zuordnungstabelle nach den Fremdschlüsseln durch einen Join nachschlagen.

0

Sie können sich auch Jamie Thomson 's SSIS Normalizer Komponente ansehen. Ich habe es gerade heute herausgefunden (habe es noch nicht probiert). Das Beispiel, das er postet, sieht sehr ähnlich dem in deiner Frage aus.

Verwandte Themen