Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Ideen : SoftDelete nachträglich in ein großes Projekt einbauen (https://www.delphipraxis.net/177762-ideen-softdelete-nachtraeglich-ein-grosses-projekt-einbauen.html)

baumina 26. Nov 2013 10:59

Datenbank: mysql • Version: 5.5 • Zugriff über: UniDAC

Ideen : SoftDelete nachträglich in ein großes Projekt einbauen
 
Habt ihr mir ein paar Ideen wie ich in mein vorhandenes Projekt nachträglich ein SoftDelete auf alle Tabellen meiner Datenbank realisieren könnte. Immer wieder werden versehentlich Daten gelöscht und um dieses Löschen wieder rückgängig machen zu können, brauche ich eine gute Lösung.
Ich brauche sicherlich ein Delete-Flag in jeder Tabelle. Dann müsste ich dieses Flag natürlich in allen selects berücksichtigen und deletes in updates umwandeln.
Ich würde hier gern ein paar Ideen und Anregungen von euch haben, wie ich das am Besten ohne viel Schaden anzurichten umsetzen könnte, bevor ich mich an die Umbaumaßnahmen mache.

EDIT : Ich benutze INNODB
EDIT : Ich benutze keine constraints (oh Gott, das musst ich erstmal googeln was das ist)
EDIT : Bislang habe ich weder Viewes noch Trigger in meiner Datenbank. Diese besteht nur aus einfachen unabhängigen Einzeltabellen. Alle Abhängigkeiten werden im Programm durch selects gelöst.

hstreicher 26. Nov 2013 11:15

AW: Ideen : SoftDelete nachträglich in ein großes Projekt einbauen
 
also wenn es nicht gerade die MyISAM Engine ist sondern was brauchbares wie INNODB dann einfach
mit einem Before Delete Trigger die Daten in eine identische Tabelle rüberkopieren

CREATE OR ALTER TRIGGER TestTab_BD0 FOR TesTab
ACTIVE BEFORE DELETE POSITION 0
AS begin insert into TestTabRollback select * from TestTab t where t.id=old.id;end

BUG 26. Nov 2013 11:18

AW: Ideen : SoftDelete nachträglich in ein großes Projekt einbauen
 
Du kannst versuchen, das Ganze über Views und Trigger zu lösen.

Am einfachsten ist ein View, der nur nicht-gelöschte Einträge anzeigt. Der sollte sich lesend so verhalten wie die Tabelle davor. Danach kannst du versuchen, insert/update/delete über Trigger auf dem View ermöglichen und auf Operationen auf der darunter liegenden Tabelle abzubilden.

Anschließend sollte sich das View wie die Tabelle vorher benutzen lassen. Wie stark sich das auf die Performance auswirkt, habe ich leider keine Erfahrung.

EDIT: hstreichers Vorschlag ist vermutlich einfacher und performanter.

jobo 26. Nov 2013 12:15

AW: Ideen : SoftDelete nachträglich in ein großes Projekt einbauen
 
Auf den ersten Blick würde ich sagen:
hstreichers Vorschlag ist die einfachste (unaufwändigste) Lösung.
Grundsätzlich sind Views auf Tabellen mit allem was dazu gehört aber sicher eleganter und mächtiger.

Auf den 2. Blick kommt dann direkt auch diese Variante mit den Views (BUG) ins Spiel.

Sobald Du referential constraints definiert hast (nicht nur einen sondern alles wie es sein soll), ist es mit eben rauswerfen und in andere Tabelle kopieren nicht mehr getan. Da müssen die Ref Constraints natürlich berücksichtigt werden. Mit Views und Status/Löschflag wär das kein Problem.

Aber: Wenn das Problem so ist wie beschrieben (einfach so einen Datensatz gelöscht), hast Du ja vielleicht gar keine Constraints? Sonst würden die ja knallen. Oder Du hast cascade delete drin?

Man sieht mal wieder, die "beste" Lösung gibt es nicht.

joachimd 26. Nov 2013 12:15

AW: Ideen : SoftDelete nachträglich in ein großes Projekt einbauen
 
Falls Du auch Änderungen nachverfolgen willst, kannst Du mal in meinem Blog schauen, wie ich es in ADS gelöst habe.

baumina 26. Nov 2013 12:57

AW: Ideen : SoftDelete nachträglich in ein großes Projekt einbauen
 
Ich danke euch schon mal für die zahlreichen Ideen und Anregungen. Besagtes Programm gibt es schon seit vielen Jahren, nachdem mein Vorgänger die Firma verlassen hatte, lag es paar Jahre brach. Nun versuche ich es so step by step zu modernisieren. Zuerst alles von Delphi5 auf Delphi XE, dann von mysql 3 auf mysql 5 und INNODB, dann von Zeos auf UniDAC. Im Moment bin ich dabei überall Transaktionen einzubauen. Leider habe ich durch die aktuellen Programmzeilen und DB-Anweisungen einen Tunnelblick bekommen, so dass mir manchmal gar nicht klar ist wieviel mehr Möglichkeiten ich mir durch manch Erneuerungen geschaffen habe.

Auch aus diesen Gründen ist mir euer Input so wichtig, nochmals ganz herzlichen Dank.

sx2008 26. Nov 2013 13:53

AW: Ideen : SoftDelete nachträglich in ein großes Projekt einbauen
 
Ich würde das SoftDelete aber nicht generell vorsehen sondern nur bei den Tabellen bei denen es sinnvoll ist.
Nehmen wir z.B. eine Kundentabelle.
Daran hängen i.d.Regel weitere Tabellen wie Bestellungen, Reklamationen, usw.
Also sollte man Kunden nicht hart löschen sondern nur den Status auf "Inaktiv" oder "gelöscht" setzen.
Und natürlich sollte der Benutzer einen umschaltbaren Filter haben so das er nur die aktiven Kunden oder die nicht aktiven Kunden oder auch Alles sieht.
In diesem Zuge sollte man sich gleich auch überlegen ob es nicht Sinn macht statt nur einem "Gelöscht"-Flag gleich ein Statusfeld mit mehr als 2 Zuständen einzuführen.
Ein Kundendatensatz könnte z.B. folgene Stati haben: Neu, Aktiv, Liefersperre, Insolvent, VIP, gelöscht

Im Gegensatz dazu nehmen wir z.B. eine Tabelle in der Textbausteine für die Rechnungserstellung abgelegt sind.
Hier wäre ein SoftDelete sinnlos und würde nur die Software unnötig komplizieren.

baumina 26. Nov 2013 14:17

AW: Ideen : SoftDelete nachträglich in ein großes Projekt einbauen
 
Im Moment habe ich das große Problem, dass es immer wieder vor kommt, dass ein Benutzer einen Auftrag versehentlich löscht. Um dies zu vermeiden, hat mich mein Chef gebeten eine doppelte Abfrage zu machen, wobei das 2. Sind-Sie-wirklich-sicher-Fenster in Knallgelb und roter Riesenschrift den Bildschirm ziert. Doch wie mein Chef so ist, telefonierend und noch 20 Sachen nebenzu machend, schafft er es trotzdem immer wieder versehentlich den Auftrag zu löschen, statt nur die eine Position, die er löschen wollte.

Jetzt möchte er, dass er überall wo gelöscht wird, dies wieder rückgängig machen kann (also auch im Kunden- und Teilestamm etc.). Auf die Frage, wann er denn dann dieses ganze gelöschte Zeugs endgültig löschen möchte, konnte er mir keine befriedigende Lösung vorschlagen. D.h. ich sollte mir darüber auch noch Gedanken machen, dass meine Datenbank nicht irgendwann komplett überquillt.

EDIT : Über eine Art "Kasse 2 bitte Storno" habe ich auch schon nachgedacht, das aber dann wieder verworfen, da der Chef ja den Stornoschlüssel hätte und somit nichts gewonnen wäre, denn ob er jetzt 2 mal OK drücken muss oder noch ein Passwort eingeben soll, käme sicher aufs gleiche raus.

Uwe Raabe 26. Nov 2013 15:15

AW: Ideen : SoftDelete nachträglich in ein großes Projekt einbauen
 
Nur so ein Gedanke: Ich weiß ja nicht, wie deine Export/Import-Möglichkeiten sind, aber es wäre auch eine Überlegung wert, die gelöschten Daten extern in Dateien auszulagern (irgendwie sinnvoll benannt). An gelöschten Daten könnte ja eh nichts geändert werden, insofern ist das keine Einschränkung. Wenn das Löschen rückgängig gemacht werden soll, dann importierst du die Daten einfach wieder. Liegen die Dateien dann zu lange ungenutzt rum, spricht wohl auch nichts gegen ein Aufräumen.

Dazu braucht es auch keinen Eingriff in die Datenbank (sei es Struktur oder Trigger). Da wo die Kontrollabfrage kommt, schreibst du die Daten einfach raus, bevor du sie löscht. Mit einem separaten Dialog kann man dann aus den exportierten Dateien genau die passende auswählen und importieren.

BUG 26. Nov 2013 16:19

AW: Ideen : SoftDelete nachträglich in ein großes Projekt einbauen
 
Zitat:

Zitat von baumina (Beitrag 1237472)
Über eine Art "Kasse 2 bitte Storno" habe ich auch schon nachgedacht, das aber dann wieder verworfen, da der Chef ja den Stornoschlüssel hätte und somit nichts gewonnen wäre, denn ob er jetzt 2 mal OK drücken muss oder noch ein Passwort eingeben soll, käme sicher aufs gleiche raus.

Du könntest den Chef zum Bestätigen den Namen des zu löschenden Objektes tippen lassen, wie es viele Online-Spiele machen.
Damit würde er eintippen müssen, ob es ein Auftrag oder eine Position ist. Da soll er sich mal rausreden :lol:

Abgesehen davon finde ich es fraglich, ob es klug ist, Aufträge oder Kunden überhaupt zu löschen (abgesehen von persönlichen Daten aus Datenschutzgründen). Ein Status, wie sx2008 ihn vorschlägt, wäre wohl insgesamt günstiger. Wenn man noch weiter geht, könnte man auch die Änderung an Datensätzen (mit Timestamp und Nutzer) dokumentieren, um im Zweifelsfall den Dialog mit dem Kunden nachzuvollziehen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:17 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz