AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Ideen : SoftDelete nachträglich in ein großes Projekt einbauen
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von baumina · begonnen am 26. Nov 2013 · letzter Beitrag vom 2. Dez 2013
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#1

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

  Alt 26. Nov 2013, 11:59
Datenbank: mysql • Version: 5.5 • Zugriff über: UniDAC
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.
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)

Geändert von baumina (26. Nov 2013 um 13:33 Uhr)
  Mit Zitat antworten Zitat
hstreicher

Registriert seit: 21. Nov 2009
220 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

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

  Alt 26. Nov 2013, 12:15
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

Geändert von hstreicher (26. Nov 2013 um 12:20 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#3

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

  Alt 26. Nov 2013, 12:18
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.
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#4

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

  Alt 26. Nov 2013, 13:15
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.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
678 Beiträge
 
Delphi 12 Athens
 
#5

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

  Alt 26. Nov 2013, 13:15
Falls Du auch Änderungen nachverfolgen willst, kannst Du mal in meinem Blog schauen, wie ich es in ADS gelöst habe.
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#6

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

  Alt 26. Nov 2013, 13:57
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.
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#7

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

  Alt 26. Nov 2013, 14:53
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.
fork me on Github
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#8

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

  Alt 26. Nov 2013, 15:17
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.
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)

Geändert von baumina (26. Nov 2013 um 15:22 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.442 Beiträge
 
Delphi 12 Athens
 
#9

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

  Alt 26. Nov 2013, 16:15
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#10

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

  Alt 26. Nov 2013, 17:19
Ü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

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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:45 Uhr.
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