Beim Löschen von Daten aus Tabellen, die verknüpfte Daten in anderen Tabellen enthalten, können verschiedene Probleme auftauchen – mal werden Daten mitgelöscht, die man noch braucht, mal bleiben Daten erhalten, die eigentlich ebenfalls gelöscht werden sollen. Die referentielle Integrität und die Löschweitergabe sind eine Möglichkeit, verknüpfte Daten zu löschen, aber ihr Einsatz will sorgfältig durchdacht sein. Diese und andere Techniken erläutert der vorliegende Beitrag.
Genau wie bei den Beziehungen gibt es auch bei den Varianten, ob und wie verknüpfte Datensätze eines Datensatzes einer Tabelle mitgelöscht werden sollen: Bei den Beziehung spricht man gemeinhin von der 1:n-, der m:n- und der 1:1-Beziehung, wobei letztlich alles auf der 1:n-Beziehung basiert. Das Datenmodell der Beispieldatenbank (siehe Bild 1) liefert ein paar Beziehungstypen, deren Verhalten in Bezug auf das Löschen von Datensätzen wir uns im folgenden ansehen werden.
Bild 1: Datenmodell der Beispieldatenbank
Fall 1: Lookup-Tabellen
Lookup-Tabellen sind Tabellen, die Details zur Haupttabelle liefern und diese zur Auswahl anbieten – meist über ein Nachschlage- beziehungsweise Kombinationsfeld. Ein Beispiel ist die Tabelle tblAnreden, welche die verschiedenen Werte für das Feld AnredeID der Tabelle tblAnreden liefert.
Wie soll das Löschverhalten hier aussehen Das ist einfach: Weder das Löschen eines Mitarbeiters noch einer Anrede sollte sich auf die Datensätze der jeweils anderen Tabelle auswirken. Aber: Es dürfen zwar Datensätze der Tabelle tblMitarbeiter gelöscht werden, denen eine Anrede zugewiesen wurde, aber keine Anrede, die bereits einem Mitarbeiter zugewiesen wurde.
Dies realisiert man über die Festlegung referentieller Integrität für die Beziehung zwischen beiden Tabellen. Diese kann man nur im Beziehungen-Fenster einstellen, und zwar am schnellsten durch einen Doppelklick auf den Beziehungspfeil. Dadurch erscheint der Dialog aus Bild 2, in dem wir bereits referentielle Integrität festgelegt haben.
Bild 2: Referentielle Integrität für die Beziehung zu einer Lookup-Tabelle
Was genau bewirkt referentielle Integrität in diesem Fall Beim Versuch, einen Datensatz der Tabelle tblAnreden zu löschen, dessen Primärschlüsselwert bereits im Fremdschlüsselfeld AnredeID der Tabelle tblMitarbeiter gespeichert ist, zeigt Access die Meldung aus Bild 3 an. Sie besagt, dass der Datensatz nicht gelöscht werden kann, da eine andere Tabelle in Beziehung stehende Datensätze enthält.
Bild 3: Die referentielle Integrität verhindert das Löschen verknüpfter Daten – aber nur in eine Richtung.
Wenn Sie in diesem Fall keine referentielle Integrität definiert hätten, könnte ein Benutzer leicht Datensätze der Tabelle tblAnreden löschen.
Andererseits besteht ja auch die Möglichkeit, zusätzlich zur referentiellen Integrität die Löschweitergabe zu aktivieren. Manche Entwickler machen dies aus Unwissenheit immer, obwohl es wenig erheiternde Folgen haben könnte. Löschweitergabe für die Beziehung zwischen tblMitarbeiter und tblAnreden würde zum Beispiel bedeuten, dass beim Löschen einer Anrede auch alle Mitarbeiter gelöscht würden, welche mit dieser Anrede verknüpft sind.
Für 1:n-Lookupbeziehungen ist die Festlegung referentieller Integrität ohne Löschweitergabe also die richtige Einstellung.
Fall 2: 1:n-Beziehungen
Im Gegensatz zu 1:n-Lookupbeziehungen gibt es auch „echte“ 1:n-Beziehungen, bei denen nicht nur der Inhalt eines Feldes ausgegliedert in eine verknüpfte Tabelle wurde, sondern die in der Regel zwei Tabellen verknüpfen, die Abbildungen echter Objekte sind. In der Beispieldatenbank sind dies Kunden und Projekte, wobei für jedes Projekt über das Feld KundeID der Kunde ausgewählte werden kann, für den dieses Projekt durchgeführt wird.
Hier gilt wie bei der Lookup-Beziehung: Wenn keine referentielle Integrität festgelegt ist, dann kann der Benutzer sowohl Kunden als auch Projekte unabhängig voneinander löschen, was sicher nicht gewünscht ist.
Mit referentieller Integrität können Sie ein Projekt löschen, ohne das der Kundendatensatz davon berührt wird, aber Sie können nur Kunden löschen, denen keine Projekte zugeteilt wurden. Besitzt ein Kunde mindestens ein Projekt, kann er nicht ohne vorheriges Löschen entfernt werden.
Auch hier ist die Aktivierung der Löschweitergabe vorsichtig einzusetzen, aber immerhin unter Umständen nützlich: Beim Löschen eines Kunden würden auch all seine Projekte gelöscht. Wenn es sich um einen Kunden handelt, dessen Projektdaten nicht mehr benötigt werden oder der samt Projektdaten archiviert wurde, kann man ruhigen Gewissens den kompletten Kunden samt seiner Projekte aus der Datenbank entfernen.
m:n-Beziehungen
Bei m:n-Beziehungen wie etwa der zwischen Projekten und Mitarbeitern ist referentielle Integrität ebenfalls Pflicht, denn sonst könnte man Datensätze der Tabellen tblMitarbeiter oder tblProjekte löschen, ohne dass eventuell damit verknüpfte Datensätze der Verknüpfungstabelle tblProjektmitarbeiter entfernt werden.
Wenn man mit der Löschweitergabe arbeiten wollte, kann man diese unabhängig voneinander für eine der beiden 1:n-Beziehungen einer m:n-Beziehung einsetzen – egal, ob die andere Beziehung mit referentieller Integrität und gegebenenfalls auch mit Löschweitergabe definiert ist.
Der Datensatz der m:n-Verknüpfungstabelle wird in jedem Falle gelöscht, da nur er selbst per Fremdschlüsselfeld auf andere Tabellen verweist. Dementsprechend lassen sich auch Datensätze der Verknüpfungstabelle ohne weitere löschen.
Verknüpfungen mehrerer Tabellen
Manchmal zieht die referentielle Integrität weiter Kreise: In unserem Beispieldatenmodell sind beispielsweise die Beziehungen zwischen den Tabellen tblKunden und tblProjekte sowie tblProjekte und tblProjektmitarbeiter mit referentieller Integrität definiert. Angenommen, wir würden Löschweitergabe für die Beziehung zwischen tblKunden und tblProjekte definieren, damit beim Löschen eines Kunden auch seine Projekte gelöscht werden, aber es gäbe über die Tabelle tblProjektmitarbeiter bereits eine Zuweisung des Projekts zu einem oder mehreren Mitarbeitern, dann geschieht beim Löschen des Kunden folgendes:
- Wenn Löschweitergabe für die Beziehung zwischen tblProjekte und tblProjektmitarbeiter definiert ist, werden mit dem Kunden all seine Projekte und auch die Zuweisungen zu den Projektmitarbeitern gelöscht.
- Wenn keine Löschweitergabe für die Beziehung zwischen tblProjekte und tblProjektmitarbeiter definiert ist, dann löscht Access den Datensatz nicht und gibt eine entsprechende Meldung aus.
Benutzergesteuertes Behandlung von Löschvorgängen
Nun möchten Sie den Benutzer der Anwendung sicher nicht mit den (hier zugegebenermaßen aussagekräftigen) Meldungen von Access allein lassen, sondern eigene Meldungen liefern und dem Benutzer weitere Möglichkeiten beim Scheitern von Löschvorgängen aufzeigen.
Löschen von Kunden mit und ohne Projekte
Bild 4 zeigt eine ganz einfache Konfiguration aus Haupt- und Unterformular zum Bearbeiten von Kunden und deren Projekten. Das Hauptformular verwendet die Tabelle tblKunden als Datenherkunft, das Unterformular die Tabelle tblProjekte. Die beiden Eigenschaften Verknüpfen von und Verknüpfen nach des Unterformularsteuerelements sorgen dafür, dass das Unterformular jeweils die zum Kunden des Hauptformulars passenden Projekte anzeigt.
Bild 4: Ein einfaches Formular zur Darstellung von 1:n-Beziehungen
Wenn wir nun versuchen, den aktuellen Kunden zu löschen (Klick auf den Datensatzmarkierer des Hauptformulars, dann Entfernen-Taste betätigen), verweigert Access erwartungsgemäß den Dienst und zeigt den Grund in einer Meldung an: Der Datensatz könne nicht gelöscht werden, weil die Tabelle tblProjekte verknüpfte Datensätze enthielte.
Wie können wir diese Meldung unterdrücken und im Falle des Versuchs, einen Kunden mitsamt seinen Projekten zu löschen, dafür sorgen, dass dies auch klappt
Die einfachste Variante ist natürlich, dem Kunden ein Meldungsfenster zu präsentieren, dass ihn darauf hinweist, dass er einfach vorher alle Projekte löschen soll.
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