Verteilte Datenbanken André Minhorst, Duisburg Kleinere Datenbankanwendungen mit wenigen Inhalt Benutzern und nicht allzu großem Datenverkehr 1 Gründe für verteilte Anwendungen... 1 können auch im Netzwerk problemlos mit Access 2 Aufteilen von Datenbanken... 1 bewältigt werden. Das gilt auch, wenn die Datenbanken ihre Daten von unterschiedlichen Orten 3 Verknüpfungen automatisch aktualisieren3 beziehen zum Beispiel aus der Projektdatenbank, der Kundendatenbank, der Mitarbeiterdatenbank usw. Dabei gibt es allerdings einige Punkte zu beachten. Der vorliegende Beitrag erläutert die Benutzung verteilter Datenbanken am Beispiel der Nordwind-Datenbank. 1 Gründe für verteilte Anwendungen Da die Anwendungslogik also die Abfragen, Formulare, Berichte und so weiter aber möglichst auf den Rechnern der Anwender vorliegen sollen, um die Netzlast zu minimieren, müssen Sie die Datenbank zwangsläufig aufteilen. Im Datenbankbereich spricht man von verteilten Anwendungen, wenn sich Benutzerfrontend und/oder Datenbackend auf mehrere Datenbanken aufteilen. Das kann im Wesentlichen zwei Gründe haben: Mehrere Benutzer sollen auf ein und denselben Datenbestand zugreifen können. 1.2 Verteilte Datenbanken Manchmal wächst mit der Zeit auch die Anzahl der in einer Firma verwendeten Datenbanken. Das liegt meiste daran, dass jede Abteilung ihr eigenes Süppchen kocht und eigene Datenbanken erstellt mit der Folge, dass das Unternehmen Datenbanken doppelt führt. Zwei Datenbanken sind so miteinander verknüpft, dass mindestens eine auf die Daten der anderen zugreift. 1.1 Mehrbenutzerbetrieb Die Datenbank Nordwind ist ein gutes Beispiel für eine verteilte Datenbankanwendung. Dort sollen mehrere Anwender auf den gleichen Datenbestand zugreifen. Zwar hat jeder Mitarbeiter unter Umständen seinen eigenen Kundenstamm, aber allein im Falle der Abwesenheit eines Mitarbeiters sollten andere Mitarbeiter auf die jeweiligen Daten zugreifen können. Damit dies funktioniert, müssen die Daten die sich in den Tabellen befinden von allen beteiligten Rechnern aus erreichbar sein. Wenn Daten also in der einen oder anderen Form bereits vorliegen, sollte man auf bereits Vorhandenes zugreifen, statt die gleichen Daten nochmals zu speichern. Das verhindert redundante Daten, Inkonsistenzen und jede Menge Ärger. Access bietet die Möglichkeit, Tabellen von bereits bestehenden Datenbanken in anderen Datenbanken weiter zu verwenden. 2 Aufteilen von Datenbanken Das Aufteilen von Datenbanken erledigt in der Regel ein Assistent. Da Sie aber vermutlich die volle Kontrolle haben wollen und sich nicht auf den Assistenten verlassen möchten, führen Sie die Aufteilung und anschließende Verknüpfung einer Datenbank und ihrem Backend einfach einmal von Hand durch. Außerdem kommen Sie so leichter zurecht, wenn Sie nicht alle Tabellen 1
Verteilte Datenbanken mit Access ins Backend stellen möchten oder gegebenenfalls Tabellen in verschiedenen Backends unterzubringen sind. Mit der vorliegenden Anleitungen können Sie beliebige Datenbanken aufteilen und wieder verknüpfen. Dabei ist es sinnvoll abzuwägen, ob Abb. 1: Importieren von Tabellen nicht manche Tabellen gegebenenfalls in der jeweiligen Frontend-Datenbank besser aufgehoben sind das ist beispielsweise zwingend der Fall, wenn die Datenbank eine Tabelle mit Optionen, etwa für spezielle Einstellungen der Benutzeroberfläche enthält. Ein anderer Fall sind temporäre Tabellen, in denen Daten oder Ergebnisse zwischengespeichert werden. Befinden diese sich in den einzelnen Frontenddatenbanken, haben Sie direkt zwei Fliegen mit einer Klappe geschlagen: Die temporären Daten müssen nicht über das Netzwerk hin- und hertransportiert werden und Sie müssen sich nicht darum kümmern, dass mehrere Mitarbeiter auf die selbe temporäre Tabelle zugreifen und sich gegebenenfalls ins Gehege kommen. step by step 1 Legen Sie eine neue Datenbank an und speichern Sie diese unter dem Namen Nordwind_be.mdb. Abb. 2: Verknüpfen der Daten aus dem Backend 2 Wählen Sie den Menübefehl Datei Externe Daten Importieren aus. 3 Wählen Sie die Datei Nordwind.mdb. 4 Markieren Sie alle Tabellen und klicken Sie auf die Schaltfläche OK (s. Fehler! Verweisquelle konnte nicht gefunden werden.). Den ersten Schritt haben Sie somit durchgeführt. Sie haben die Backend-Datenbank erstellt und mit den Daten gefüllt. Abb. 3: Anzeige verknüpfter Tabellen im Datenbankfenster Im zweiten Schritt bearbeiten Sie nun die Original- und zu- 2
künftige Frontenddatenbank. Zuvor müssen Sie jedoch die neue Backenddatenbank noch schließen, da Sie sonst die Tabellen nicht verknüpfen können. Bevor Sie die folgenden Schritte durchführen, sollten Sie die Originaldatenbank sichern. step by step 1 Öffnen Sie die Originaldatenbank. 2 Löschen Sie alle Tabellen, die Sie in die Backendtabelle auslagern möchten. 3 Wählen Sie den Menübefehl Daten Externe Daten Tabellen verknüpfen aus. 4 Wählen Sie im Dialog Verknüpfen die Backenddatenbank aus. 5 Wählen Sie im Dialog Tabellen verknüpfen (s. Fehler! Verweisquelle konnte nicht gefunden werden.) die zu verknüpfenden Tabellen aus. Access zeigt die verknüpften Tabellen im Datenbankfenster an. Ein Pfeil weist auf die Verknüpfung hin (s. Fehler! Verweisquelle konnte nicht gefunden werden.). 3 Verknüpfungen automatisch aktualisieren Unter manchen Umständen verändert sich der Speicherort der Backendtabelle. Die Folge: Die Frontenddatenbank findet das Backend nicht mehr. Im Prinzip müssen Sie in diesem Fall einfach die Tabellen erneut mit dem Frontend verknüpfen. Dem Anwender sollten Sie das aber nicht zumuten. Erstens gibt es Anwender, die damit überfordert sind, und zweitens müssen Sie unter Umständen alle vorhandenen Frontends aktualisieren. Also schreiben Sie eine kleine Prozedur, mit der Sie die Verknüpfungen fast komplett automatisch aktualisieren können (s. Quellcode 1). Die Routine verwendet eine weitere Funktion zum Anzeigen des Datei öffnen-dialogs. Den entsprechenden Code finden Sie im Modul mdlfiledialog in der Beispieldatenbank VerteilteDatenbanken97.mdb (Access 97) beziehungsweise VerteilteDatenbanken00.mdb (Access 2000 und höher). Der Aufruf der Funktion erfolgt über die Anweisung LinkTable, die Sie an geeigneter Stelle in das Frontend einbauen beispielsweise in die Beim Laden-Ereignisprozedur eines beim Start aufgerufenen Formulars. Damit stellen Sie sicher, dass die Verknüpfungen auf jeden Fall überprüft werden. 3.1 Ablauf der Aktualisierung der Verknüpfungen Die Funktion LinkTable müssen Sie für jede zu verknüpfende Tabelle einmal aufrufen, und zwar mit dem Tabellennamen als Parameter. Der Aufruf für die Aktualisierung der Verknüpfung zu der Tabelle Artikel erfolgt beispielsweise mit folgender Anweisung: LinkTable "Artikel" Die Funktion liest den Pfad der Herkunftsdatenbank dieser Tabelle in die Variable strcurrentbackend ein. Dazu verwendet sie die Dlookup- Funktion und ermittelt damit den entsprechenden Wert aus der Systemtabelle MSysObjects. Im Optimalfall findet die Funktion die Datenbank unter dem angegebenen Pfad, alle weiteren Fälle werden weiter unten beschrieben. Das Vorhandensein der Datenbank vorausgesetzt, durchsucht die Funktion die TableDefs- Auflistung nach einer Tabelle mit dem angegebenen Namen und aktualisiert die Verknüpfung zu dieser, womit die Funktion ihren Dienst bereits getan hätte. Kommen wir zu den nicht optimalen Fällen: Wenn bei der Aktualisierung der Verknüpfung ein Fehler auftritt, springt die Funktion zurück zur Marke Checkpath. Das Fehlerobjekt Err ent- 3
Verteilte Datenbanken mit Access hält in dem Fall einen Wert größer 0 und der erste Teil des If Then-Konstrukts wird durchlaufen. Es erscheint eine Meldung, die dem Benutzer die Möglichkeiten bietet, entweder die richtige Datenbank für die Aktualisierung der Verknüpfung auszuwählen oder die Anwendung zu schließen. Diesen Teil springt die Funktion auch dann an, wenn die als Herkunftdatenbank angegebene Datei nicht vorhanden ist. Da Sie diese Funktion für jede einzelne Tabelle aufrufen können, ist es auch möglich, Tabellen aus verschiedenen Datenbanken einzubinden. Public Function LinkTable(strTablename As String) On Error GoTo LinkTable_Err Dim db As Database Dim tdf As TableDef Dim strcurrentbackend As String Dim lnganswer As Long Set db = CurrentDb strcurrentbackend = DLookup("Database", "MSysObjects", "Name = '" _ & strtablename & "' AND Type =6") Checkpath: If Dir(strCurrentBackend) = "" Or Err > 0 Then lnganswer = MsgBox("Die Verknüpfung mit der Tabelle '" & strtablename _ & "' ist fehlgeschlagen. Klicken Sie auf 'Ja', um das richtige Backend " _ & "auszuwählen und 'Nein', um abzubrechen.", vbyesno) Select Case lnganswer Case vbyes strcurrentbackend = OpenFilename("Choose backend", "*.mdb") Case vbno DoCmd.Quit End Select End If For Each tdf In db.tabledefs On Error Resume Next If tdf.name = strtablename Then tdf.connect = ";database=" & strcurrentbackend tdf.refreshlink If Err.Number > 0 Then GoTo Checkpath End If Next tdf LinkTable = True LinkTable_Exit: Set db = Nothing Exit Function LinkTable_Err: LinkTable = False MsgBox "Fehler-Nr: " & Err.Number & vbcrlf & "Fehler-Beschreibung: " & Err.Description GoTo LinkTable_Exit End Function Quellcode 1 4
Außerdem erhalten Sie bei einem missglückten Versuch, die Tabellen einzubinden, Feedback, an welcher Tabelle es gelegen hat. So können Sie zielgerichteter überprüfen, weshalb die Verknüpfung fehlgeschlagen ist. 5