Per Mausklicks, Makro oder VBA-Routine lassen sich in der Jet-Engine unter MS Access gespeicherte Tabellen
wie beschrieben leicht nach DB2 migrieren. Eine Datenbank besteht aber nicht nur aus einer zusammenhanglosen Ansammlung von Tabellen. Die Access-Exportfunktion transportiert eigentlich nur Struktur und Daten von A nach B, ignoriert aber Indizes, Primär- und Fremdschlüssel.
Ohne ihn jemals angewandt zu haben, bin ich mir sicher, dass MS mit seinen Upsizing-Agenten auch diese Datenbank-Objekte migriert. Leider eben nur auf den SQL-Server. Als Strafe dafür, dass ich die
schöne neue MS-Welt frevelhaft verlassen will, muss ich leider eine Extrarunde programmieren. Aber danach lassen sich auch Indizes und Schlüssel nach DB2 portieren.
Dazu muss ich nur die TableDef-Objekte ausbeuten, so wie ich es für die Export-Routine für alle Tabellen meiner Access-Anwendung getan habe - eigentlich nur eine Schleife um "
DoCmd.TransferDatabase". Mit diesem Kommando übertrage ich Struktur und Daten einer Tabelle, das ist dann aber auch schon alles. Beim Transfer von Indizes oder Integritätsbedingungen helfen wieder die TableDef-Objekte. Hier finde ich die Eigenschaften, die ich zur Erstellung geeigneter "create index" oder "alter table" benötige.
Für meine VBA-Exportroutine sieht das im Wesentlichen so aus:
cretaeidx = "create index " & IdxName & " on " & TabName & "(" & IdxField & ")"
(oder "create unique index" ...) zur Erstellung von Indizes und
pkey = "alter table " & TabName & " add constraint " & IdxName & " primary key (" & IdxField & ")"
zur Erstellung von Primärschlüsseln. Dabei kann man die benötigten Variablen folgendermaßen besetzen:
TabName = """" & db.TableDefs(i).Name & """"
IdxName = """" & .db.TableDefs(i).Indexes(j).Name & """"
IdxField = """" & Mid(db.TableDefs(i).Indexes(j).Fields, 2) & """"
Besser ist es, dem Indexnamen (IdxName) noch den zugehörigen Tabellennamen voranzustellen. Denn Access erlaubt die Mehrfachbenutzung von Namen für Indizes unterschiedlicher Tabellen, DB2 dagegen nicht - wie es der SQL-Standard fordert.
Da Access keine zusammengesetzten Indizes kennt, enthält die Eigenschaft "Fields" in der letzten Anweisung nur einen Spaltennamen, allerdings mit einem vorangesetzen "+". Für Primärschlüssel braucht kein Index angelegt werden, dies erledigt ein vernünftiges DBMS bei der Anlage des Schlüssels. Und was Standardkonformität angeht angeht, ist DB2 das Vernünftigste.
Beim Abbilden von Indizes und Integritätsbedingungen aus Tabellen, die unter Access mit der Jet-Engine erstellt wurden, sind leider noch folgende Unebenheiten zu beachten: Unter Access ist es möglich, Spalten als Primärschlüsseln zu erklären, die
Aufgenommen: Apr 09, 21:28
Was bisher geschah: Die Tabellen einer MS-Access-Anwendung sind zu groß geworden für die Jet-Engine. DB2 ist die Wahl der Stunde für die Datenhaltung als skalierbare, performate und vertrauenswürdige Basis. Tabellendefinitionen und Daten lassen sich
Aufgenommen: Apr 18, 11:10