Historisierungskonzept programmieren / Datensatz zurücksetzen auf Tag x
-
Hallo Zusammen,
ich möchte gerne Historisierung der Datensätze in meiner Software einbauen. Es geht darum das alle Änderungen protokolliert werden. Sobald jemand auf den alten Stand eines Datensatzes zugreifen will, öffnet er/sie ein Fenster und kann sehen wann Änderungen stattgefunden haben. Dann wählt der User ein Datensatz aus und setzt dann das ganze Datensatz zurück. Nicht nur ein Feld, sondern das ganze Datensatz soll dann genauso aussehen wie am besagten Tag.
Da es sich hierbei um ein Dialog handelt der auf Daten von mehr als eine Tabelle zugreift, kann die Versionierung von Datenbank nicht genutzt werden.
Ich möchte gerne wissen welches Konzept benutzt ihr um ein Datensatz auf einen alten Stand zurückzusetzen? Oder welches Konzept würdet ihr bevorzugen?
- für Jede Tabelle existiert eine _HST Tabelle. Sobald ein Datensatz geändert wird, wird der altstand in die _HST Tabelle gespeichert.
- Es gibt nur ein Protokoll Tabelle. Änderungen aus allen Tabellen werden hier reingeschrieben. Mit TabellenBezeichnung, Feldbezeichnung, AlteWert, NeuerWert usw.
- kennt ihr bessere Alternativen?
Wer kann von Erfahrungen berichten?
Danke im Voraus.
SK
-
-
Auf jeden Fall nicht 2 (eine einzige Protokolltabelle).
Was ich zu 1 noch hinzufügen würde: es ist oft gut in der History-Tabelle statt des Datums der Änderung eine Transaktions-ID reinzuschreiben die in eine Transaktions-Tabelle verweist. So kann man dann schön alle Änderungen die man in einer Transaktion macht zusammenfassen.
Das selbe Prinzip sollte sich auch auf die 2. Variante anwenden lassen die im Link von @Swordfish beschrieben ist.
Dadurch kann man sich dann relativ einfach den Stand der gesamten Datenbank zu einem bestimmten Zeitpunkt rekonstruieren.
-
Also erstmal danke für die Antworten.
@Swordfish dein Link war echt hilfreich. Danke dafür.
zu 1 - History-Tabelle: Mein Problem ist das ich dann zu viele Tabellen habe. Jede Tabelle doppelt zu halten, bei dem Softwarepacket die wir in der Firma haben. Wird echt viel. Strukturänderungen muss dann immer in beiden Tabellen stattfinden sowie Append und andere Funktionen aus der Datenmodul muss immer doppelt gemacht werden. Man hat nicht nur die Tabellen doppelt sondern auch jede Menge Sourcecodes. Was ich eigentlich nicht so gut finde.
Die Insert-Only Tabellen aus dem Link von @Swordfish hört sich momentan am besten an. Hat jemand Erfahrung damit?
Ich bespreche das mit mein Kollegen und schau mal was dabei rauskommt.
-
Was für eine Datenbank verwendet ihr denn? Kannst du keine DB-Trigger verwenden, um die Historie-Tabellen zu füllen? s.a. What is a Database Trigger?
-
DB-Trigger kannte ich so noch gar nicht. Das ist eine feine Sache. Danke das es erwähnt hast.
Allerdings fällt damit nur eine einzige Funktion aus der Datenmodul weg. Stattdessen muss ein Trigger auf dem Datenbank programmiert werden. Damit hat man das Problem lediglich verlagert.
Außerdem glaube ich das Insert-Only Methode in diesem Fall die beste Variante ist. Außer du kannst mich vom Gegenteil überzeugen?
Wir verwenden MSSQL Server 2019
-
@SK0325 sagte in Historisierungskonzept programmieren / Datensatz zurücksetzen auf Tag x:
Außer du kannst mich vom Gegenteil überzeugen?
Es gibt keine Satzsperren.
Was hat das alles mit C++ Builder zu tun?