Autor Beitrag
Kossy
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53



BeitragVerfasst: Mi 04.04.12 21:08 
Hallo zusammen !

Man kann ja per CASACDE in SQL in Kombination mit der Referentiellen Integrität sicherstellen, dass wenn ein Datensatz in einer Tabelle verändert oder gelöscht wird, dies auch in allen anderen Tabellen geschieht, um so die Datenkonsistenz in der Datenbank zu bewahren.

Ich habe jetzt über diese CASADE Anweisungen mal gehört, dass man sie nur mit extremer Vorsicht einsetzen sollte (oder am besten erst gar nicht verwenden).

Eine bessere Alternative wäre es wohl, diese Lösch- oder Änderungsvorgänge selbst zu schreiben, umso immer zu 100% die Gewalt über seinen Datenbestand behalten zu können.

Ich verstehe aber nicht, wie ich bei solchen Aktionen vorgehen muss. Soll ich zuerst alle Fremdschlüssel und dann die dazugehörigen Primärschlüssel in den entsprechenden Tabellen löschen? Oder muss ich da anders herangehen?

Kann mir das vielleicht jemand von euch anhand eines simplen Beispieles (vielleicht über 3 oder 4 Tabellen) kurz erläutern?

Besten Dank für Antworten und Hilfestellungen !!!!

Viele Grüße
--Kossy--
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 04.04.12 23:04 
Zitat:
Ich verstehe aber nicht, wie ich bei solchen Aktionen vorgehen muss.


Wenn man ein halbwegs vernünftig designetes System, insbesondere eins das verständlich benannte Entitäten enthält, hat sollte es in fast allen Fällen eigentlich offensichtlich sein wie man vorgehen sollte. Zum Beispiel ist es in einem Bestellsystem logisch das man keinen Kunde löschen kann wenn noch Bestellungen zu diesem Kunden existieren. Es macht einfach keinen Sinn noch Bestellungen im System zu haben wenn man den Kunden nicht ermitteln kann. Wenn man sich von den üblichen Normalisierungsregeln leiten lässt sollte ein DB System auch genau das forcieren und verhindern (außer natürlich man hat das System mit flächendeckendem CASCADE bei den Constraints zum Schweigen gebracht)

Zitat:
Soll ich zuerst alle Fremdschlüssel und dann die dazugehörigen Primärschlüssel in den entsprechenden Tabellen löschen?


Ja, erst die Stellen löschen in denen ein Verweis auf eine Row benutz wird (Fremdschlüssel) und dann eben diese Row(Primärschlüssel).

Zitat:
Kann mir das vielleicht jemand von euch anhand eines simplen Beispi eles (vielleicht über 3 oder 4 Tabellen) kurz erläutern?


Machen wir es umgekehrt. Du stellst ein Beispiel auf bei dem du dich schwer tust und wir versuchen das dann aufzulösen.
Kossy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53



BeitragVerfasst: Do 05.04.12 08:55 
Hallo Ralf !

Zitat:

Machen wir es umgekehrt. Du stellst ein Beispiel auf bei dem du dich schwer tust und wir versuchen das dann aufzulösen.


Nehmen wir an, ich habe folgende kleine Datenbank:

Tabellen:
Mitarbeiter, Projekt, Abteilung


1. Zwischen den Tabellen Mitarbeiter und Projekt besteht eine n:m Beziehung, d.h. zwiwschen diesen beiden Tabellen existiert eine Mappingtabelle, die diese n:m Beziehung quasi abbildet.

2. Zwischen den Tabellen Mitarbeiter und Abteilung besteht eine 1:1 Beziehung.



Was ich jetzt nicht verstehe ist, wie ich vorgehen muss, wenn ich einen Mitarbeiter löschen möchte, der auch in dieser Mappingtabelle existiert und dazu auch noch in der Tabelle Abteilung als FK eingetragen ist.

Besten Dank für die Hilfe !

Viele Grüße
--Kossy--
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4799
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 05.04.12 09:20 
Hallo Kossy,

das erscheint mir doch relativ einfach: zuerst löscht du alle Einträge des zu löschenden Mitarbeiters aus der Mitarbeiter-Projekt-Mapping-Tabelle und zuletzt den Mitarbeiter selbst.

Einzig was ich nicht verstehe:
Zitat:
2. Zwischen den Tabellen Mitarbeiter und Abteilung besteht eine 1:1 Beziehung.
Kann es pro Abteilung nur je einen Mitarbeiter geben?
Da du aber von
Zitat:
Mitarbeiter ... in der Tabelle Abteilung als FK eingetragen ist.
sprichst, gehe ich mal von einer 1:N Beziehung hier aus, so daß du auch hieraus den Eintrag für diesen Mitarbeiter löschen mußt (bevor du den Mitarbeiter selbst löschst).
Ansonsten zeig mal dein DB-Schema für diese Tabelle 'Abteilung' (evtl. hast du ja einen Design-Fehler und deswegen diese Frage gestellt).
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 05.04.12 10:38 
Zitat:
2. Zwischen den Tabellen Mitarbeiter und Abteilung besteht eine 1:1 Beziehung.


Ich kann hier nur raten das der Mitarbeiter in der Abteilung eine besondere Rolle hat und darum über eine 1:1 Beziehung abgebildet ist. Also zum Beispiel das der Mitarbeiter Abteilungsleiter ist oder sowas. In dem Fall sind wir dann eher bei der Businesslogik als bei einer rein technischen 'wie lösche ich' Frage. Technisch wäre das nach deiner Beschreibung deines Schemas ja das die Abteilung ebenfalls gelöscht werden muß (vor dem Mitarbeiter). Technisch korrekt aber von der Logik her höchst wahrscheinlich unfug. In dem Fall wäre ein CASCADE fatal da CASCADE ja eine rein technische Lösung liefert die Logik aber ignoriert und die Abteilung mitgelöscht hätte. Für eine echte Beantwortung der 'wie lösche ich' Frage benötigen wir also eine Definition der gewünschten Logik. Ein Beschreibung des Schemas reicht nicht.
Kossy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53



BeitragVerfasst: Fr 06.04.12 17:23 
Hallo nochmal !

Wie genau musss ich denn vorgehen, wenn ich aus dieser Mappingtabelle etwas löschen möchte.

Muss ich da zuerst explizit dem FK Constraint löschen oder reicht einfach eine SQL Anweisung wie "DELETE FROM mappingtab WHERE spalte1 = fk"

Viele Grüße
--Kossy--
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Sa 07.04.12 12:06 
Es wäre ein ziemlich überflüssiger Constraint den ich abschalten kann (oder eventuell muss) um eine Funktion auszuführen die im Context einer Anwendung sinnvoll wäre oder?
Es reicht natürlich ein simpler Delete auf diese Tabelle. Wenn nicht ist mit nahezu 100%-er Sicherheit dein Model falsch.