Einzelnen Beitrag anzeigen

Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#8

AW: Reihenfolge beim einspielen von Tabellen ermitteln

  Alt 26. Apr 2012, 08:42
Hallo zusammen und danke für die Vorschläge. Vllt. nochmal zum Hintergrund: Es gab einen Dump einer DB in eine .sql Datei, die nun alle Tabellen, samt Datentypen und Daten untereinandergeschrieben enthält, die Tabellen alphabetisch.

Aufgabe (für Azubi) war nun diese Datei, die ja eigentlich nur eine Textdatei ist so zu sortieren, das die Tabellen in einer Reihenfolge kommen, damit es nicht knallt.

Habe das nun so gelöst, dass ich die Textdatei zerlegt habe in einzelne Dateien für jede Tabelle, wobei Tabellen ohne Daten gleich weggelassen wurden. Das war Programmteil 1.

Dann habe ich die benötigte Reihenfolge ermittelt (Ziel dieses Threads, s.u.) und die Tabellendateien in der Reihenfolge wieder zu einer zusammengefasst.

Diese Datei kann nun mit einem entsprechenden Tool der Software (für die diese Datenbank da ist) importiert werden. Das war die Vorgabe, es muss dieses Tool genutzt werden und die Tabellen müssen in der Reihenfolge passen, sonst kann das Tool das nicht.

Das direkte reinschreiben in die DB, z.B. mit SQL-Loader o.ä., wäre möglich, mit de- und anschl. reaktivierung der Constraints, bzw. dem Oracle-SQL-Loader ist das sowieso egal, der paukt die Daten ohne Rücksicht auf Verluste in die DB, mein ich. Aber das wollte wohl die Fachabteilung nicht, die wollten den Import-Assi nutzen.

------------
Back to Topic:
Ich hab es wie im Anfang des Threads geplant gemacht:
Erst alle Parent-Tabellen, die nicht selber Child-Tabellen sind.
Dann alle Child-Tabellen.
Dann alle restl. Tabellen.

Dabei hab ich für Punkt 2 zwei Listen erstellt: Eine mit Childtabellen und eine leere. In die leere zunächst die Parenttabellen aus Punkt 1 geschrieben.
Dann bin ich die Liste der Childtabellen durchgegangen und hab für jedes Child eine Rekursive-Funktion aufgerufen, etwa so:

Delphi-Quellcode:
procedure AddTabToList(Tabname:String)
var
  t:TStringlist;
  i:Integer;
begin
if not AlreadyInList(Tabname) then
  begin
  t:=TStringlist.create;
  GetParents(Tabname,t); //schreibt in t alle Parents von Tabname
  for i:=0 To t.Count-1 do
    AddTabToList(t.Strings[i]);
  AddToList(Tabname);
  t.free;
  end
end;
Damit hat es funktionert, weil es keine zirkulären abhängigkeiten in den Tabellen-Constraints gab. Hätte es welche gegeben wäre das in die Hose gegangen.
Ralph

Geändert von Jumpy (26. Apr 2012 um 08:45 Uhr)
  Mit Zitat antworten Zitat