Datenbanken und Tabellen per SQL anpassen

Datenbanken per SQL erstellen Dazu gibt es doch die Access-Benutzeroberfläche! Das hilft Ihnen aber wenig weiter, wenn Sie eine Anwendung für einen Kunden entwickelt haben und änderungen am Datenmodell vornehmen müssen, ohne vor Ort zu sein, oder den Kunden fernsteuern möchten. Es gibt doch auch noch die Fernwartung Klar, aber wenn die Software nicht nur bei einem, sondern bei vielen Kunden in Betrieb ist …

Am offenen Herzen

Es ist technisch kein Problem, einem Kunden eine neue Version der Benutzeroberfläche seiner Datenbank zukommen zu lassen, wenn diese sauber vom Backend getrennt ist. Altes Backend wegsichern, neues an die gewünschte Stelle kopieren, vielleicht noch automatisiert die Tabellen einbinden, fertig.

Aber was, wenn änderungen am Datenmodell, also am Backend, notwendig werden Das Backend austauschen Wie denn Dazu müsste man zum Beispiel das Backend umbenennen, das neue Backend hinzufügen, die Daten aus dem alten Backend in das neue Backend importieren oder das Backend mit den aktuellen Daten vom Kunden schicken lassen, die änderungen in Windeseile vornehmen und das Backend wieder zurückschicken. Beides ist keine optimale Lösung. Viel schöner wäre es doch, wenn man einfach zum Kunden fährt und dort von Hand mal eben eine Tabelle hinzufügt, einen Felddatentyp ändert oder andere Anpassungen durchführt. Aber wie bereits erwähnt, macht das auf Dauer keinen Spaß, wenn Sie vielleicht mehrere Kopien der Software bei weit verstreuten Kunden laufen haben.

Da aber Access jede Aktion, die man mit der Benutzeroberfläche durchführt, genau wie Datenabfragen oder -änderungen auch irgendwie an die Jet Engine kommunizieren muss, scheint es logisch, dass es auch hierfür passende SQL-Abfragen gibt. Und genau das ist der Fall: SQL teilt sich in zwei Teile auf, nämlich in DML (Data Manipulation Language) und DDL (Data Definition Language). DML umfasst die Befehle zum Abfragen und zum ändern der in den Tabellen enthaltenen Daten und DDL liefert die Anweisungen zum Manipulieren des Datenmodells – genau genommen können Sie damit sogar komplette Datenbanken anlegen (wobei das Anlegen selbst per DAO geschieht).

Datenbank anlegen

Sie werden nun zunächst von einer bestehenden Datenbank aus eine neue Datenbank anlegen (das könnten Sie theoretisch auch in einem VBScript oder von einer anderen Anwendung mit VBA-Entwicklungsumgebung erledigen, aber wir wollen ja kein Auswärtsspiel). Dies funktioniert unter Access für JET-Datenbanken nicht wie bei anderen Datenbanksystemen mit der CREATE DATABASE-Anweisung, sondern Sie müssen die CreateDatabase-Methode des DBEngine-Objekts zu Hilfe nehmen:

DBEngine.CreateDatabase CurrentProject.Path & "\Suedsturm.mdb", dbLangGeneral, dbVersion40

Diese Anweisung legt eine neue Datenbankdatei namens Suedsturm.mdb im Verzeichnis der aktuellen Datenbank an und legt mit ihren Optionen fest, dass die Spracheinstellungen für Deutschland und einige weitere Länder verwendet werden und eine Datenbank für die Verwendung mit Jet 4.0 erzeugt wird. dbLangGeneral ist eine Konstante mit dem Inhalt ;LANGID=0x0409;CP=1252;COUNTRY=0, der Sie beispielsweise noch einen Ausdruck wie pwd=kennwort hinzufügen können, um ein Kennwort festzulegen. Mit dem Wert dbEncrypt können Sie die Datenbank zusätzlich verschlüsseln.

Tabellen anlegen

Tabellen legen wir aber nun per SQL an. Dazu verwenden Sie die CREATE TABLE-Anweisung, die den Tabellennamen und zumindest die Angabe eines Felds erwartet (es funktioniert auch ohne Feld, aber diese Tabelle lässt sich anschließend nicht im Entwurf öffnen). Bauen wir eine Tabelle namens tblKategorien (siehe Bild 1). Das Grundgerüst erstellt die folgende SQL-Anweisung:

pic001.tif

Bild 1: Die Tabelle tblKategorien der Südsturm-Datenbank

CREATE TABLE tblKategorien(
KategorieID INT,
Kategoriename VARCHAR(255),
Beschreibung LONGTEXT,
Abbildung IMAGE)

Neben dem Tabellennamen geben Sie also die Felder gefolgt vom Datentyp in Klammern in einer durch Kommata getrennten Liste an.

Die Datentypen finden Sie übrigens in Tab. 1, zusammen mit den jeweils entsprechenden Datentypen für den Tabellenentwurf.

Das Ergebnis ist noch nicht ganz befriedigend: Es fehlen noch die Primärschlüsseleigenschaften des Felds KategorieID. Was tun Es gibt zwei Möglichkeiten: Entweder, Sie löschen die Tabelle noch einmal und geben die erforderlichen Informationen beim erneuten Anlegen mit ein, oder Sie reichen die Primärschlüssel-Eigenschaften so nach.

Tabelle löschen

Die erste Variante erfordert zunächst das Löschen der Tabelle, die dazu geschlossen sein muss:

DROP TABLE tblKategorien

Primärschlüssel einrichten

Anschließend statten Sie die CREATE TABLE-Anweisung so aus:

CREATE TABLE tblKategorien(
KategorieID INT CONSTRAINT PK PRIMARY KEY, ...

Alternativ fügen Sie diesen sogenannten CONSTRAINT an das bestehende Feld an, wobei PK der Name des dadurch erzeugten Index für das Feld KategorieID ist:

ALTER TABLE tblKategorien
ADD CONSTRAINT PK PRIMARY KEY (KategorieID)

Autowert einrichten

Fehlt noch die Autowert-Eigenschaft. Dafür brauchen Sie einfach nur das Schlüsselwort COUNTER statt des Datentyps INT anzugeben:

CREATE TABLE tblKategorien(
KategorieID COUNTER
CONSTRAINT PK PRIMARY KEY, ...

Indizes anlegen

Mit dem CONSTRAINT-Schlüsselwort lassen sich nicht nur Primärschlüssel, sondern auch sonstige Indexfelder festlegen. Sollte das Feld Kategoriename beispielsweise wie in Bild 2 indiziert werden, fügt man einen Index wie folgt hinzu:

pic002.tif

Bild 2: Feld mit einem einfachen Index

CREATE INDEX I ON tblKategorien(Kategoriename)

Einen einfachen Index können Sie nicht direkt beim Anlegen der Tabelle hinzufügen.

Eindeutige Indizes

Eine eindeutige Indizierung können Sie sowohl beim Anlegen der Tabelle als auch nachträglich festlegen. Die Version beim Anlegen sieht so aus:

CREATE TABLE tblKategorien(...,
Kategoriename VARCHAR(255)
CONSTRAINT U UNIQUE, ...)

Das nachträgliche Hinzufügen geschieht so:

CREATE UNIQUE INDEX U ON tblKategorien(Kategoriename)

Beide wirken sich wie in Bild 3 aus.

pic003.tif

Bild 3: Ein eindeutiger Index im Indizes-Fenster

Nullwerte verhindern

Darf ein Feld keine Nullwerte enthalten, fügen Sie ihm beim Anlegen die Klausel NOT NULL hinzu:

CREATE TABLE tblKategorien(...,
Kategoriename VARCHAR(255) NOT NULL, ...)

Auf diese Weise stellen Sie die Eigenschaft Eingabe erforderlich der Entwurfsansicht auf Ja ein.

Fremdschlüsselfelder festlegen

Beziehungen werden in relationalen Datenbanken durch Fremdschlüsselfelder definiert.

Daher legen Sie nun gleichzeitig eine neue Tabelle namens tblArtikel an und fügen dieser ein Fremdschlüsselfeld namens KategorieID hinzu, das mit dem Primärschlüsselfeld der Tabelle tblKategorien verknüpft werden soll:

CREATE TABLE tblArtikel(
ArtikelID COUNTER CONSTRAINT PK PRIMARY KEY,
Artikelname VARCHAR(255) NOT NULL,
KategorieID INT,
CONSTRAINT FK FOREIGN KEY(KategorieID)
REFERENCES tblKategorien)

Zusammen mit der Tabelle tblKategorien ergibt sich das Bild aus Bild 4.

pic004.tif

Bild 5: Beziehung mit aktivierter Aktualisierungs- und Löschweitergabe

Löschweitergabe und

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar