Leo Elsenberg

Programmierung, Datenbanken, IT-Dienstleistungen, -Schulungen und -Nachhilfe

Datendefinition einer Access Datenbank generieren

Mit Microsoft Access, einschließlich der aktuellen Version Microsoft Access 2013, ist es nicht möglich die Datendefinition (DDL) einer Datenbank zu generieren und z.B. zur Weiterverarbeitung in einer Textdatei zu speichern. Eine Möglichkeit besteht darin die DDL, wie in der nachfolgenden Schritt-für-Schritt Anleitung beschrieben, unter Zuhilfenahme des Microsoft SQL Servers 2008 R2 Express with Advanced Services SP1 zu generieren,  wobei als Ausgangsdatenbank Microsoft Access 2010 verwendet wird.

Schritt 1: Microsoft SQL Server 2008 R2 Express installieren

In einem ersten Arbeitsschritt installieren Sie den Microsoft SQL Server 2008 R2 Express with Advanced Services SP1. Bei Verwendung eines 64-Bit Betriebssystems empfiehlt sich die Installation der 64-Bit Version. Anschließend exportieren Sie, wie unten gezeigt,  die Microsoft Access Datenbank zum Microsoft SQL Server, generieren das DDL-Skript und passen es an Microsoft Access an.

Schritt 2: Microsoft Access Upsizing-Assistent ausführen

Zunächst starten Sie Microsoft Access 2010 und öffnen die Datenbank von welcher das DDL-Skript generiert werden soll. Um die ausgewählte Access Datenbank zum Microsoft SQL Server zu exportieren wählen Sie in Microsoft Access 2010 das Menüband bzw. Ribbon "Datenbanktools", klicken in der Gruppe "Daten verschieben" auf "SQL Server" und folgen den Anweisungen des Upsize-Assistenten. Die nachfolgend beschriebenen Schritte können, da sich Microsoft Access 2007 bezüglich des Exports zum SQL Server lediglich durch eine geringfügig anders aufgebaute Gruppe "Daten verschieben" von Microsoft Access 2010 unterscheidet, auch mit Microsoft Access 2007 durchgeführt werden.

Hinweis: Obschon immer wieder kolportiert wird, dass für den Export eine Microsoft SQL Server Version kleiner oder gleich der Microsoft Access Version verwendet werden sollte, z.B. Microsoft Access 2010 und Microsoft SQL Server 2008 oder Microsoft Access 2007 und Microsoft SQL Server 2005, gelingt der Export zum Microsoft SQL Server 2008 auch aus Microsoft Access 2007 fehlerfrei. Ebenso ist es möglich eine Microsoft Access 2003 Datenbank zum aktuellen Microsoft SQL Server 2014 zu exportieren!

Hinweis: Da der Microsoft SQL Server 2005 weder den Datentyp DATE (Datum), noch den Datentyp TIME (Uhrzeit) unterstützt, sondern ausschließlich den auch vom Microsoft SQL Server 2008 unterstützten Datentyp DATETIME (Datum + Uhrzeit), werden Datums- und/oder Uhrzeitfelder bei einem Export zum Microsoft SQL Server 2005 ggf. mit dem unzutreffenden Datentyp DATETIME angelegt.

Im ersten Schritt des Upsizing-Assistenten wählen Sie die Option "Neue Datenbank Erstellen" und klicken auf die "Weiter" Schaltfläche.

Im darauf folgenden Fenster wählen Sie im Kombinationsfeld "Welchen Server mit SQL Server möchten Sie für diese Datenbank verwenden?" den auf ihrem System installierten SQL Server. Sollte der SQL Server nicht gelistet sein, geben Sie diesen in der Form Computername\Serverinstanz in das Kombinationsfeld ein. Anschließend klicken Sie das Kontrollkästchen "Vertrauenswürdige Verbindung verwenden aktivieren" (verwenden ihrer Windows Zugangsdaten zur Authentifizierung) an und geben der neuen SQL Server-Datenbank einen Namen. Nach einem Klick auf die "Weiter" Schaltfläche gelangen Sie zum nächsten Fenster.

Hinweis: Der Servername (Kombination aus Server (i.e.S. Computername) und SQL Server (i.e.S. Name der SQL Server Instanz)) kann, wie Sie dem markierten Eintrag im Kombinationsfeld "Servername:" in der Abbildung unten entnehmen können, bei Bedarf aus dem Microsoft SQL Server 2008 R2 Anmeldedialog abgeleitet werden.

Im dritten Schritt wählen Sie im Kombinationsfeld "Zeitstempelfeld in Tabellen einfügen?" die Option "Nein, nie", aktivieren das Kontrollkästchen "Nur die Tabellenstruktur erstellen; keine Daten portieren" und klicken auf die "Weiter" Schaltfläche.

Im vierten Fenster wählen Sie die Tabellen aus, welche zum SQL Server exportiert werden sollen, und klicken anschließend auf die "Weiter" Schaltfläche.

Im vorletzten Fenster des Upsizing-Assistenten wählen Sie die Option "Keine Anwendungsänderungen" und klicken auf die "Weiter" Schaltfläche um zum letzten Fenster des Upsizing-Assistenten zu gelangen.

Im letzten Fenster des Upsizing-Assistenten klicken Sie auf die "Fertig stellen" Schaltfläche.

Nach der Erstellung der SQL Server Datenbank wird ein ausführlicher Access Bericht angezeigt. Falls in diesem Bericht Fehler gemeldet werden, sollten Sie versuchen die Fehlerquelle(n) beheben und den Upsizing-Assistenten ggf. erneut ausführen.

Seitenanfang


Schritt 3: DDL-Skript generieren

Um das DDL-Skript zu generieren starten Sie den Microsoft SQL Server 2008 R2 Express with Advanced Services SP1, wählen die in Frage kommende Datenbank, erweitern den Ordner Tabellen und markieren die für das DDL-Skript benötigten Tabellen:

Anschließend klicken Sie mit der rechten Maustaste in den markierten Bereich, wählen "Skript für Tabelle als", klicken im sich öffnenden Untermenü auf "CREATE in" und wählen "Neues Abfrage-Editor-Fenster". Der Microsoft SQL Server generiert daraufhin das DDL-Skript und zeigt dieses im Abfrage-Editor-Fenster an:

Das vom Microsoft SQL Server generierte DDL-Skript speichern Sie zur Weiterverarbeitung in einer Textdatei. Bevor Sie die Datei speichern empfehle ich den Dateityp in "Textdateien (*.txt)" zu ändern und der Datei einen sprechenden Namen zu geben:

Da einige Microsoft SQL Server Datentypen und Anweisungen von den korrespondierenden Microsoft Access Datentypen und Anweisungen abweichen, müssen Sie in einem letzten Schritt die betroffenen Datentypen und Anweisungen anpassen und alle Befehle, welche ausschließlich für den Microsoft SQL Server relevant sind, entfernen. Und dann ist es geschafft: Sie haben erfolgreich die Datendefinition (DDL) einer Microsoft Access Datenbank erstellt!

Da die oben beschriebene Vorgehensweise eine neue Microsoft SQL Server Datenbank anlegt, welche nach Abschluss der Arbeiten wieder gelöscht werden sollte, empfiehlt sich die Verwendung eines virtuellen Computers. Auf diesem virtuellen Computer aktivieren Sie, bevor sie mit der Generierung des DDL-Skripts beginnen, den Rückgängig-Datenträger. Da Kopiervorgänge vom Gastsystem in ein Verzeichnis des Hostsystems nicht immer gelingen, empfiehlt es sich, das erstellte DDL-Skript mittels Drag-and-Drop auf den Desktop des Hostsystems zu kopieren. Anschließend beenden Sie die virtuelle Maschine und stellen sicher, dass alle Änderungen rückgängig gemacht werden. Nach dem Herunterfahren befindet sich der virtuelle Computer, einschließlich des darauf installierten Microsoft SQL Servers, wieder im Ausgangszustand.

Sollte auf Ihrem System kein virtueller Computer installiert sein, empfehle ich vor Arbeitsbeginn ein Festplattenimage zu erstellen. Um alle Änderungen rückgängig zu machen, spielen Sie nach Beendigung der Arbeiten das zuvor erstellte Festplattenimage zurück.

Seitenanfang


DDL-Beispielskripte

Zur Veranschaulichung der Überführung eines Microsoft SQL Server 2008 DDL-Skripts in DDL-Skripte bzw. -Anweisungen anderer Datenbanken können Sie hier eine im Excel 97-2003 Format gespeicherte Microsoft Excel Arbeitsmappe herunterladen. In dieser Microsoft Excel Arbeitsmappe finden Sie, ausgehend vom überarbeiteten Microsoft SQL Server 2008 DDL-Skript, aus welchem alle überflüssigen Kommentare und Anweisungen entfernt wurden, die angepassten DDL-Anweisungen für den Microsoft SQL Server 2005, Microsoft Access und IBM DB2.

Da keines der großen Datenbanksysteme (IBM DB2, Microsoft SQL Server und Oracle) den Microsoft Access Datentyp YESNO unterstützt, muss dieser Datentyp bei Verwendung des Microsoft SQL Servers durch den Datentyp BIT und bei IBM DB2 oder Oracle durch den Datentyp SMALLINT ersetzt werden. Beim Microsoft SQL Server 2005 fehlen die Datentypen DATE und TIME, welche durch einen anderen geeigneten Datentyp, ich empfehle NVARCHAR(n), ersetzt werden sollten. Der Microsoft Access Datentyp Autowert (COUNTER) wird beim Microsoft SQL Server durch die IDENTITY Anweisung und bei IBM DB2 vermittels der Identitätsspalte (GENERATED ALWAYS AS IDENTITY) realisiert. Des Weiteren unterscheiden sich die DDL-Anweisungen der Beispiele durch das benutzte Schema (IBM DB2: SLIDES - Microsoft SQL Server: dbo) und der Verwendung englischsprachiger Tabellennamen beim DBMS IBM DB2. Weitere Unterschiede entnehmen Sie bitte der Excel Arbeitsmappe.

Fernerhin verdeutlicht die fehlende Möglichkeit mit DDL-Anweisungen Tabellen und Spalten mit einem Kommentar zu versehen, wie dies z.B. beim DBMS IBM DB2 mit den Befehlen COMMENT ON TABLE bzw. COMMENT ON COLUMN realisiert ist, dass Microsoft Access keineswegs mit ausgewachsenen Datenbanksystemen vergleichbar ist. Da die Microsoft SQL Server Syntax, mit welcher Tabellen und Spalten mit einem Kommentar versehen werden, zu komplex ist um an dieser Stelle beschrieben zu werden, verweise ich diesbezüglich auf die Microsoft SQL Server Online-Hilfe.

Zusätzlich unterscheiden sich 'echte' Datenbanken und Microsoft Access dahingehend dass, da IBM DB2, Microsoft SQL Server und Oracle Scripting unterstützen, diese ein DDL-Skript 'in einem Rutsch' verarbeiten können; Microsoft Access jedoch nur die schrittweise Abarbeitung, d.h. jede Tabelle und Einschränkung muss einzeln in einer Abfrage erstellt bzw. zugeordnet werden, erlaubt. Diese Access Beschränkung kann, wie im Beispiel unten gezeigt, durch Ausführung der einzelnen DDL-Anweisungen innerhalb einer VBA Prozedur umgangen werden:

Private Sub TabellenAnlegen()
    With DoCmd
        .RunSQL "CREATE TABLE Modelltypen " & _
                "([Modelltyp] char(30) NOT NULL, " & _
                "[Modelltyp_ID] counter, " & _
                "CONSTRAINT Modelltypen_PK PRIMARY KEY ([Modelltyp]));"
        .RunSQL "CREATE INDEX Modelltyp_IND ON Modelltypen (Modelltyp);"
        .RunSQL "CREATE TABLE Modelldetails " & _
                "([ModellNr] char(20) NOT NULL, " & _
                "[Modelltyp] char(30) NOT NULL, " & _
                "[ModellBezSpez] char(50), " & _
                "CONSTRAINT Modelldetails_PK PRIMARY KEY ([ModellNr]), " & _
                "CONSTRAINT Modelltyp_FK FOREIGN KEY (Modelltyp) REFERENCES Modelltypen (Modelltyp));"
        .RunSQL "CREATE INDEX Modelltyp_IND ON Modelldetails (Modelltyp);"
        .RunSQL "CREATE TABLE Kostenstellen " & _
                "([Kostenstelle] long NOT NULL, " & _
                "[BezeichnungKostenstelle] char(50) NOT NULL, " & _
                "CONSTRAINT Kostenstellen_PK PRIMARY KEY ([Kostenstelle]));"
        .RunSQL "CREATE INDEX BezeichnungKostenstelle_IND ON Kostenstellen (BezeichnungKostenstelle);"
    End With
End Sub

Anmerkungen: Wie Sie den VBA Anweisungen entnehmen können, muss jede Tabellenerstellungsabfrage (CREATE TABLE) und Indexerstellung (CREATE INDEX) gesondert ausgeführt werden. Auch die Reihenfolge, in welcher die einzelnen Tabellen, Einschränkungen (CONSTRAINT) und Indizes erstellt werden, ist von entscheidender Bedeutung, da hierbei prinzipbedingt nach der Bottom-Up Methode vorgegangen werden muss; d.h. ein Index (PRIMARY KEY) bzw. Fremdschlüssel (FOREIGN KEY) kann nur einem Attribut einer bereits zuvor im Skript erstellten Tabelle zugeordnet werden. Jeder DoCmd.RunSQL Befehl schließt, durchaus vergleichbar mit dem bei großen Datenbanksystemen gebräuchlichen COMMIT, den Vorgang ab und trägt die Tabelle einschließlich zugehöriger Einschränkungen und Indizes in die Systemtabellen ein. Bei beiden Microsoft SQL Servern (2005 und 2008) wird jede Tabellenerstellungsdefinition und Fremdschlüsselzuweisung mit GO ausgeführt und in die Systemtabellen eingetragen. Wenngleich beim Datenbankmanagementsystem IBM DB2 jede Tabellenerstellungs- und Einschränkungsdefinition einzeln mit COMMIT WORK ausgeführt und in die Systemtabellen eingetragen werden kann, ist es durchaus zulässig COMMIT WORK nach der letzten Tabellenerstellungs- bzw. Einschränkungsdefinition zu verwenden, um alle im Skript definierten Tabellen und zugeordneten Einschränkungen anzulegen und in die Systemtabellen einzutragen. Der gesamte Vorgang wird beim DBMS IBM DB2 üblicherweise mit TERMINATE beendet.

Seitenanfang