![]() |
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. |
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 |
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. |
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. |
AW: Ideen : SoftDelete nachträglich in ein großes Projekt einbauen
Falls Du auch Änderungen nachverfolgen willst, kannst Du mal in
![]() |
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. |
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. |
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. |
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. |
AW: Ideen : SoftDelete nachträglich in ein großes Projekt einbauen
Zitat:
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. |
AW: Ideen : SoftDelete nachträglich in ein großes Projekt einbauen
@Uwe
So etwas wollte ich auch erst vorschlagen. Also eine Serialisierung von gelöschten Daten sozusagen. Beim späteren "wiederimportieren" müssten dann aber auch die diversen Abhängigkeiten zwischen den Tabellen berücksichtigt werden. Insofern würde ich wohl auch eher ein Gelöscht-Flag andenken. |
AW: Ideen : SoftDelete nachträglich in ein großes Projekt einbauen
Hätte ich denn serverseitig auch Möglichkeiten, da irgendetwas umzustellen, dass man im Allgemeinen Aktionen rückgängig machen könnte? So eine Art undo-last-Transaction. Denn meist fällt der Fehler ja gleich auf.
|
AW: Ideen : SoftDelete nachträglich in ein großes Projekt einbauen
Okay. So wie ich das sehe, gehst Du das falsche Problem an.
Das Problem ist nämlich meiner Meinung nach NICHT die fehlende Möglichkeit, gelöschtes wiederherzustellen. Das Problem ist vermutlich eher die Benutzerführung, die es dem User (Deinem Chef) zu schwer macht, das richtige Element (die Position im Auftrag) zu löschen und ihm immer das falsche Element (den Auftrag selber) anbietet. Mein Erster Vorschlag wäre hier z.b., wenn man auf der Maske (ich weiss ja nicht wie die aussieht) dann beim Drücken von 'Löschen' erstmal einen Dialog anzeigt, auf dem nichts vorselektiert ist. Hier muss er erstmal aktiv die gewünschten Positionen selektieren und kann diese dann direkt löschen. Um den kompletten Auftrag zu löschen muss man hier auf dem Dialog dann eine spezielle Schaltfläche 'Kompletten Auftrag löschen' anwählen, um den Auftrag wirklich zu löschen. So ist das löschen einzelner Positionen einfacher (Del, Selektieren, Enter, gut ist) als das des Auftrags (Del, extra auf kleinen, separaten Button navigieren, auswählen, nochmal bestätigen, weg isser). Das bekommst auch vermutlich schneller (=Billiger) hin, ohne gleich die Datenbank anzufassen. Zumindest vorschlagen würde ich das mal. Das Soft-Delete kannst Du danach - wenn es denn dann wirklich noch notwendig sein sollte ;-) - später immer noch einbauen. |
AW: Ideen : SoftDelete nachträglich in ein großes Projekt einbauen
Liste der Anhänge anzeigen (Anzahl: 1)
Ja, wie ich schon zuvor geschrieben habe, hat die Umstellung der Benutzerabfrage auch nichts gebracht. 1. Abfrage "Auftrag wirklich löschen", 2. Abfrage siehe Bild.
|
AW: Ideen : SoftDelete nachträglich in ein großes Projekt einbauen
Auch wenn man sicher benutzerseitig etwas machen kann, bei den Adressen ist es doch ganz interessant.
Wie haben bei wichtigen/relativ statischen Tabellen (Adressen als markantes Bespiel) ein Journal nebenher laufen, was jede Änderung an einem Datensatz nochmal in dieses Journal schreibt - fortlaufend. Wird der Datensatz gelöscht - gibts auch nochmal einen Eintrag. So hat man eine Historie über den gesamten Lebenslauf des Datensatzes, kann schauen wer wann was dran gemacht hat oder gelöscht hat und kann auch zu früheren Versionen zurückspringen. Hat schon mehrmals geholfen, den Angestellten zu entlasten :) |
AW: Ideen : SoftDelete nachträglich in ein großes Projekt einbauen
Zitat:
Wichtig ist, dass es "gefährliche Löschvorgänge" jeweils eigene Buttons gibt, die nicht direkt neben den Buttons für "einfaches Löschen" stehen. Dann ist die Wahrscheinlichkeit für Fehlbedienung gleich viel geringer. |
AW: Ideen : SoftDelete nachträglich in ein großes Projekt einbauen
Zitat:
"Soll der KOMPLETTE QM-Auftrag 47110815 (Fa. Böhringer, Hamburg-Altona) gelöscht werden?" Wenn das nicht drinsteht, dann gewöhnt sich der User an die Meldung und drückt auf "Ja". Vielleicht hat der Benutzer in seiner Dusseligkeit den Auftrag 47110816 angewählt. Und wenn die Meldung hochpopt dann kann der angewählte QM-Auftrag im Hintergrund überdeckt werden. |
AW: Ideen : SoftDelete nachträglich in ein großes Projekt einbauen
Zitat:
Deswegen war bei mir Übung 1 : legt mal alle eure Mäuse hinter den Bildschirm, wir arbeiten nur mit der Tastatur und siehe da, es ging alles viel schneller und einfacher. Bis heute kenne ich noch sehr viele Tastenkürzel von Windows und den Office-Produkten. Du wirst staunen wie schnell sich Excel bedienen lässt, wenn man nur Tasten statt der Maus benutzt. Bis heute bin ich der Meinung, dass jedes Programm mit der Tastatur bedienbar sein sollte. |
AW: Ideen : SoftDelete nachträglich in ein großes Projekt einbauen
Bei uns gab' es einmal die Idee, als Löschbestätigung eine kleine Rechenaufgabe lösen zu lassen um die geistige Anwesenheit des Benutzers sicher zustellen ;)
Man kann so viele Bestätigungen, Warnmeldungen, Fettgedruckte Rote Buttons etc. einbauen wie man möchte - all das wird nicht verhindern, dass Datensätze "versehentlich" gelöscht werden. Solche Maßnahmen greifen vielleicht am Anfang - solange bis sich der Benutzer an die neue Klick- und Bestätigungsarie gewöhnt hat. Der Mensch macht nun mal Fehler, auch wenn er vorher 20 mal bestätigen muss, das er wirklich sicher ist die Aktion durchführen zu wollen. In den meisten Fällen haben wir in den Tabellen einfach ein Löschflag hinzugefügt. Nur an den wirklich wichtigen Stellen gibt es eine komplette Historie mit allen Änderungen. Zitat:
sowohl per Maus als auch per Tastatur uneingeschränkt möglich sein. Dann kann der Benutzer selbst entscheiden. |
AW: Ideen : SoftDelete nachträglich in ein großes Projekt einbauen
Aber genau darum ging es ja: ein falscher Tastendruck, und schon geht das Dilemma los. Deshalb der Vorschlag, nur Mausbedienung zuzulassen, dadurch wird eine Fehlbedienung erschwert, zumindest ist das der Plan ;)
|
AW: Ideen : SoftDelete nachträglich in ein großes Projekt einbauen
Ein Dialog "Sind sie sicher das sie den Datensatz unwiderruflich löschen wollen?" mit Ja/Nein, wobei "Nein" als default ausgewählt ist sollte reichen.
Somit wird verhindert das EIN Tastendruck einen Datensatz löscht! Menschen die nicht in der Lage sind eine Maus zu bedienen (weil ihnen z.B. die feinmotorischen Fähigkeiten fehlen oder Blinde) haben dann schlechte Karten (Stichwort Barrierefreiheit) Anstatt also Zeit und Energie darauf zu verschwenden wie man sein Programm verkrüppelt und möglichst schwer bedienbar macht, könnte man die Zeit sinnvoll Nutzen und eine "Undo" Funktion implemntieren ;) |
AW: Ideen : SoftDelete nachträglich in ein großes Projekt einbauen
Bei meinen kleinen Individual-Projekten, die auf Datenbanken zugreifen, findet immer automatisch eine Sicherung bei Programmstart statt (oder zumindest steht diese Option bereit, die ich dann auch immer empfehle). Natürlich kann man keinen Anwender nachhaltig davon abhalten, nur das zu löschen, was er wirklich löschen will, denn schließlich ist er ja der einzige, der darüber entscheidet. Gäbe es einen Button für Format C: in Windows, würde sicher auch so mancher Dau dau draufdraucken ... Kürzlich hat mich ein Kunde angerufen, weil die Darstellung seiner Bilder im Explorer nicht mehr wir früher war. Der Mann hat schon seit über 10 Jahren einen Computer mit Windows, klickt aber immer ständig irgendwo rum (Mausgefummel ist dafür genau der richtige Ausdruck) und merkt das oft nicht mal.
Ich finde, Chefs und auch alle anderen, die ständig versehentlich Datensätze löschen, die sie noch benötigen, sollten erst mal den Computerführerschein machen, bevor sie ihre Untertanen oder Mitmenschen sinnlos durch die Gegend hetzen :evil: Bei diesem speziellen Chef würde ich ein Meldungsfenster aufpoppen lassen, das ihn jedesmal, wenn er einen Datensatz löschen will, daran erinnert: "Nicht doch, Cheffe, du weißt doch, daß du nicht selber löschen darfst, sondern immer mich zum Löschen holen sollst. Dein untertänigster Programmierer." Die Idee mit der zusätzlichen Boolean-Spalte zum Als-Gelöscht-Markieren finde ich die beste Lösung. Man kann dann bei Programmende oder auf Anforderung eine Tabelle mit den markierten Dateien anzeigen lassen und alle auf einmal löschen und sicherheitshalber vorher exportieren. |
AW: Ideen : SoftDelete nachträglich in ein großes Projekt einbauen
Zitat:
Wenn gefragt wird wer hat denn da was wann gemacht, so beziehen sich (nach meiner Erfahrung) 50% der Nachfragen auf "sinnlose" Daten. Ansonsten ist eigentlich schon alles wesentliches gesagt: a) Constraints und Trigger nutzen b) Ein Statusfeld/Statustabelle nutzen (ggf. mit Änderungsdatum) c) Ein Journal führen Dazu ein paar Anmerkungen: Ein Journal ist "die" Möglichkeit um nachzuvollziehen was "ich hab garnichts gemacht" in Wirklichkeit war. Wer die Möglichkeiten die a) bietet im Client nachbaut, ist selber schuld. Zum einen ist es auf dem Client wesentlich aufwendiger alle Nebeneffekte verschiedener Aktionen zu beherrschen, zum anderen gehört "Datenbankfunktionalität" auch zur Datenbank. Den Client hat nicht zu interessieren auf welche Art und Weise die DB funktioniert, Er bekommt und versendet Daten. nicht mehr und nicht weniger. Übrigens können auch Textbausteine für Rechnungen durchaus wichtig sein, wenn z.B. eine Änderung der Firma anstand und nachzuvollziehen ist ob die entsprechende Änderung auch zum richtigen Zeitpunkt eingerichtet war. Gruß K-H @Perlsau Zitat:
|
AW: Ideen : SoftDelete nachträglich in ein großes Projekt einbauen
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz