Hallo zusammen,
ich hab meine Datenbank so gebaut, dass Daten nicht gelöscht werden, wenn sie in Beziehung zu anderen Daten bestehen. Beispielsweise kann eine Person nicht gelöscht werden, wenn sie als Chef einer Abteilung in einer anderen Tabelle eingetragen ist, mit welcher sie in einer Beziehung steht. Soweit so gut.
Wenn ich in VBA in einem Statement sage "dbsCurrentDB.Execute "Delete from person where Personnummer = 42", führt die Datenbank die Löschung durch ... oder auch nicht. Im Falle dass sie die Person nicht löscht, ist das soll so, aber es kommt kein Laufzeitfehler, den ich da abfangen könnte. Gibt es vielleicht eine elegante Lösung, im Formular dem User mitzuteilen, dass der Datensatz nicht gelöscht werden konnte, weil Beziehungen? Ich meine ohne mit irgendwelchen If-Abfragen zu gucken, ob irgendwo diese Person eingetragen ist in irgendeiner Rolle? Ich habe die Idee, eine Select-Abfrage der zu löschenden Person nach dem Lösch-Statement loszulassen um zu schauen, ob die Person gelöscht wurde. Macht das Sinn oder gibt es bessere Methoden?
Die Datenbank ist so normalisiert, dass die Abteilungen und Personen mit E-Mail-Adresse in unterschiedlichen Tabellen stehen, in beiden Tabellen sind unabhängige Primärschlüssel mit Autowert; die Abteilungsnamen und die E-Mail-Adressen von Personen sind Schlüsselkandidaten. Es stehen Fremdschlüssel der Personen in den Abteilungen.
Danke und herzliche Grüße
1) Execute sollte aufgewertet werden mit dbFailOnError (in jedem Fall). Das zeigt Fehler überhaupt erst an.
2) Es ist nun gerade der Sinn einer eingestellten referentiellen Integrität, dass es nur Datensätze in einer Sekundärtabelle geben kann, wenn es in der Primärtabelle einen Datensatz mit zugehörigem Schlüssel gibt.
Wenn man löschen will, tut man das auf einem der beiden Wege:
a) In der Beziehung wird zusätzlich die Löschweitergabe aktiviert. Damit werden zugehörige Sekundärdatensätze gleich mit gelöscht.
b) Man wendet zuerst auf die Sekundärtabelle die Löschung an, und im zweiten Gang erfolgt die Löschung in der Primärtabelle.
Zitatelegante Lösung, im Formular dem User mitzuteilen, dass der Datensatz nicht gelöscht werden konnte
Wenn die Löschung zielführend ist, sollte man die schlicht ausführen. Kundenwille ist auszuführen. Was soll der User mit der gewünschten Meldung anfangen können, wenn schon der Entwickler nicht weiß, was da passiert.
Besser ist es doch, erst gar nicht Fehler zu machen, als solche zu erklären.
Hallo,
ZitatEs stehen Fremdschlüssel der Personen in den Abteilungen.
Das wäre erklärungsbedürftig. Die Mehrzahl Personen und Abteilungen ist irritierend.
Wenn eine Person nur in einer Abteilung ist und für immer auch dort bleibt, müsste bei der Person ein Fremdschlüssel zur Abteilung sein.
Wenn nein, so wäre hier eine n:m Tabelle erforderlich mit einem Fremdchlüssel zur Person und einem FS zur Abteilung in je einem Datensatz.
Zeige mal ein Bild des Beziehungsfensters.
https://www.simon-r-becker.de/nextcloud/index.php/s/8Asjrm8QqG3GCpD hier ein Ausschnitt aus dem Beziehungsfenster.
Also es ist möglich, dass eine Person eine Rolle in mehreren Abteilungen spielen könnte, aber jede Abteilung hat nur einel Abteilungsleiteron, daher habe ich das halt so designt. Diese Datenbank ist auch keine HR-Datenbank, sondern soll ein Chemikalienmanagement sein.
Über die Beziehungen Abteilungen <-> Personen denke ich nochmal nach. Ging mir nur um die Frage nach der Löschbeschränkung/- Weitergabe. Wenn ich das Löschen einer Person zulasse, obwohl sie noch irgendwo eine Rolle hat, hätte ich eine Inkonsistenz oder würde die gesamte Abteilung abbrennen, oder?
Vielen Dank für eure Hilfe, das mit dbFailOnError werde ich in jedem Fall mal ausprobieren und euch berichten.
Übrigens, das ist meine allererste Datenbank überhaupt. Es ist total klar, dass sie mit Sicherheit Designfehler hat.
Übrigens II, bei den drei Tabellen in dem Bild ohne Beziehungen weiß ich einfach noch nicht, ob ich sie überhaupt verwenden will/ob sie Sinn ergeben. Sie stehen auf der Abschussliste.
Herzliche Grüße
Hallo,
Zitat von: undefinedWenn ich das Löschen einer Person zulasse, obwohl sie noch irgendwo eine Rolle hat,
Wenn das Datenmodell stimmt und in den Beziehungen referentielle Integrität (ohne Löschweitergabe) eingestellt ist, ist das Löschen gar nicht möglich.
Zitat von: MzKlMu am September 24, 2020, 13:41:54Hallo,
Zitat von: undefinedWenn ich das Löschen einer Person zulasse, obwohl sie noch irgendwo eine Rolle hat,
Wenn das Datenmodell stimmt und in den Beziehungen referentielle Integrität (ohne Löschweitergabe) eingestellt ist, ist das Löschen gar nicht möglich.
Genau, und das soll auch so: Die Person darf nicht zu löschen sein, wenn andere Entitäten von ihr abhängen. Mir ging es darum, dass die Datenbank den User informiert, wenn er über ein Formular versucht, die Person zu löschen, die wegen einer Löschbeschränkung nicht zu löschen ist. Das ist gerade in einem Formular implementiert, das nicht primär dafür gedacht ist, sondern wahrscheinlich ist diese Funktion besser in einem Formularsatz aufgehoben, der sich auf die Verwaltung von Personen und Abteilungen beschränkt.
Also meine Frage in diesem Faden ist erstmal beantwortet (konnte es noch nicht ausprobieren, aber wenn es nicht funktioniert, melde ich mich erneut). Danke euch allen und schönes Wochenende!
Simon