Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Achtung: Dies ist nicht der vollständige Artikel, sondern nur ein paar Seiten davon. Wenn Sie hier nicht erfahren, was Sie wissen möchten, finden Sie am Ende Informationen darüber, wie Sie den ganzen Artikel lesen können.

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 1/2010.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

Zusammenfassung

Erfahren Sie, wie Sie Datenbankschemata auslesen und SQL-Anweisungen zum Nachbauen der Tabellen einer Datenbank erstellen.

Techniken

VBA, DAO, SQL

Voraussetzungen

Access 2000 und höher

Beispieldateien

SQLDump.mdb

Shortlink

www.access-im-unternehmen.de/698

SQL-Datenbankschema auslesen

André Minhorst, Duisburg

Unter dem SQL-Datenbankschema verstehen wir eine Reihe von SQL-Anweisungen, mit denen Sie Tabellen oder auch eine komplette Datenbank erstellen können. Dazu gehören beispielsweise die CREATE TABLE- oder CREATE INDEX-Anweisungen. Da man diese Befehle eher selten einsetzt, kann eine Lösung zum automatischen Erstellen des Schemas einer oder mehrerer Tabellen nicht schaden. Der vorliegende Beitrag zeigt, wie es funktioniert.

Access macht es dem Entwickler leicht: Mit der Tabellenentwurfs-Ansicht, dem Indizes-Fenster und dem Beziehungen-Fenster bietet es uns drei Möglichkeiten, Tabellen und deren Beziehungen ganz einfach anzulegen. Im Tabellenentwurfsfenster erfassen wir die grundlegenden Daten wie die Felder mit ihren Datentypen und weitere Eigenschaften, im Indizes-Fenster verwalten wir einfache und zusammengesetzte Indizes und das Beziehungen-Fenster dient schließlich dazu, die Beziehungen zwischen den Tabellen anzulegen.

Im Hintergrund rödelt Access ganz ordentlich und stellt die SQL-Anweisungen zusammen, welche die von uns angelegten Tabellen und Felder und auch Änderungen an bestehenden Elementen zur Ausführung an die JET-Engine weitergeben.

Solche Ausdrücke können Sie mit der Lösung des vorliegenden Beitrags selbst erstellen: Sie brauchen einfach nur das Formular aus Abb. 1 zu öffnen und die gewünschte Tabelle auszuwählen, schon erscheinen die SQL-Ausdrücke zum Erstellen dieser Tabellen mit den gebräuchlichsten Eigenschaften im Formular.

pic005.png

Abb. 1: Durch Auswählen einer Tabelle erhalten Sie den SQL-Ausdruck, um diese zu erstellen.

Grundlagen

SQL verwenden Sie ja normalerweise, um Abfragen für die Auswahl von Daten zu definieren oder auch zum Ausführen von Aktionsabfragen. Dieser Teil von SQL nennt sich Data Manipulation Language (DML). Für den vorliegenden Beitrag brauchen wir allerdings eine andere SQL-Teilmenge, nämlich die Data Definition Language (DDL). Sie enthält Befehle wie die oben bereits erwähnten CREATE TABLE...- oder CREATE INDEX...-Anweisungen. Mit ein wenig Einarbeitung können Sie mit diesen Befehlen Tabellen und Beziehungen sicher genauso schnell, wenn nicht noch schneller als mit den Elementen der Benutzeroberfläche erstellen.

Da die meisten von uns bequem sind, wird das aber kaum jemand tun. Dennoch kommt es vor, dass man eine oder mehrere SQL-Anweisungen zum Anlegen von Tabellen benötigt - beispielsweise, wenn Sie eine Tabelle per VBA-Code erstellen möchten. Dabei kann es sich um eine temporäre Tabelle handeln, die nur kurzzeitig benötigt und dann wieder gelöscht wird, zum Beispiel um zu importierende Daten vor dem Weiterverarbeiten zwischenzulagern. Oder Sie bauen einen Assistenten oder ein Tool, das per Mausklick Tabellen in Ihren Datenbanken anlegen soll. Dies ist zum Beispiel äußerst praktisch, wenn Ihre Datenbankanwendung immer wiederkehrerende Tabellen wie etwa eine Anreden-Tabelle enthalten soll.

Ziel der nachfolgend vorgestellten Prozeduren ist es, auf Basis bestehender Tabellen SQL-Abfragen zu erzeugen, mit denen Sie die Tabellen nachbauen können. Für eine einfache Tabelle mit einem Primärschlüsselfeld namens AnredeID und einem weiteren Textfeld namens Anrede mit einer Feldgröße von 255 Zeichen benötigen Sie beispielsweise die folgenden beiden Zeilen:

CREATE TABLE tblAnreden([AnredeID] COUNTER, [Anrede] CHAR(255));

CREATE UNIQUE INDEX [PrimaryKey] ON [tblAnreden]([AnredeID]) WITH PRIMARY DISALLOW NULL;

Das Ganze ließe sich auch mit einer einzigen Zeile erledigen, und zwar so:

CREATE TABLE tblAnreden([AnredeID] COUNTER CONSTRAINT PrimaryKey PRIMARY KEY, [Anrede] CHAR(255));

Warum wir in der nachfolgend beschriebenen Lösung die erste Variante verwenden, erfahren Sie weiter unten. Eine ganze Menge Informationen zu den Befehlen der Data Definition Language erhalten Sie im Beitrag Datenbanken und Tabellen per SQL anpassen (Shortlink 609).

DAO als Werkzeug zum Auslesen von Tabellen-, Feld- und Beziehungsinformationen

Bevor wir uns um das Erstellen der SQL-Anweisungen kümmern können, brauchen wir Möglichkeiten, die Struktur der Tabellen, Felder und Beziehungen auszulesen.

Wie aber soll dies gelingen - welche Bibliothek bietet Zugriff auf den Entwurf einer Datenbank? Es handelt sich um die DAO-Bibliothek, die Sie für den Zugriff auf die Daten einer Datenbank sicher schon Hunderte Male genutzt haben. Die für uns interessante Struktur basiert auf dem Database-Objekt, das Sie normalerweise als Ausgangspunkt für die OpenRecordset- oder die Execute-Methode verwenden. In diesem Fall greifen wir auf dessen TableDefs-Auflistung zu, die den Zugriff auf alle Tabellen der Datenbank erlaubt. Ein TableDef-Objekt wiederum enthält unter anderem die Fields-Auflistung, die wiederum die Field-Objekte und somit die Informationen über die Felder der entsprechenden Tabelle liefert. Außerdem stellt das TableDef-Objekt die Indexes-Auflistung bereit, mit der wir die Indizes der angegebenen Tabelle auslesen können.

Etwas weiter oben stellt das Database-Objekt neben der TableDefs-Auflistung auch noch die Relations-Auflistung bereit. Diese wiederum enthält die Relation-Objekte mit allen Informationen zu den im Beziehungen-Fenster angelegten Beziehungen.

Tabellendefinition auslesen

Den Start macht die Funktion GetCreateTableString (s. Listing 1). Sie erwartet ein TableDef-Objekt mit einem Verweis auf die auszuwertende Tabelle und liefert eine Zeichenkette mit dem SQL-Ausdruck zum Erstellen der entsprechenden Tabelle zurück. Diese Zeichenkette enthält die CREATE TABLE-Anweisung mit der Angabe des Namens der zu erstellenden Tabelle, die Feldliste sowie eventuell nötige CONSTRAINT-Elemente zur Definition von Fremdschlüsselfeldern.

Listing 1: Zusammenstellen der SQL-Anweisung zum Erstellen einer Tabelle

Public Function GetCreateTableString(tdf As DAO.TableDef) As String

    Dim db As DAO.Database

    Dim fld As DAO.Field

    Dim idx As DAO.Index

    Dim rel As DAO.Relation

    Dim strTable As String

    Dim strSQL As String

    Dim strSQLField As String

    Dim strFieldType As String

    Dim strConstraints As String

    Set db = CurrentDb

    strTable = tdf.Name

    strSQL = "CREATE TABLE " & strTable & "("

    For Each fld In tdf.Fields

        strSQLField = strSQLField & "[" & fld.Name & "]"

        strFieldType = GetFieldType(fld)

        strSQLField = strSQLField & " " & strFieldType & ", "

    Next fld

    strSQL = strSQL & strSQLField

    For Each idx In tdf.Indexes

        If idx.Foreign Then

            For Each rel In db.Relations

                If rel.ForeignTable = tdf.Name And idx.Fields(0).Name = rel.Fields(0).Name Then

                    strConstraints = strConstraints & "CONSTRAINT "

                    strConstraints = strConstraints & "[" & idx.Name & "] FOREIGN KEY ("

                    strConstraints = strConstraints & "[" & rel.Fields(0).Name & "]"

                    strConstraints = strConstraints & ") REFERENCES ["

                    strConstraints = strConstraints & rel.Table & "]"

                    If (rel.Attributes And dbRelationUpdateCascade) = dbRelationUpdateCascade Then

                        strConstraints = strConstraints & " ON UPDATE CASCADE"

                    End If

                    If (rel.Attributes And dbRelationDeleteCascade) = dbRelationDeleteCascade Then

                        strConstraints = strConstraints & " ON DELETE CASCADE"

                    End If

                    strConstraints = strConstraints & ", "

                End If

            Next rel

        End If

    Next idx

    strSQL = strSQL & strConstraints

    If Right(Trim(strSQL), 1) = "," Then

Sie haben das Ende des frei verfügbaren Teils des Artikels erreicht. Lesen Sie weiter, um zu erfahren, wie Sie den vollständigen Artikel lesen und auf viele hundert weitere Artikel zugreifen können.

Sind Sie Abonnent?Jetzt einloggen ...
 

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Verwandte Beiträge:

Datenbanken und Tabellen per SQL anpassen

DAO: Tabellen, Felder und Co. bearbeiten

Indizierung mit Access

Daten archivieren und wiederherstellen

Daten aus verknüpften Tabellen kopieren

Tabellen und Felder dokumentieren

Quellcode-Versionsverwaltung inside

Aktionsabfragen mit SQL

Permanenter Access Query-Analyzer

© 2003-2015 André Minhorst Alle Rechte vorbehalten.