Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Firebird: Prüfsumme für Datensatz berech. b. Ins/Update (https://www.delphipraxis.net/85715-firebird-pruefsumme-fuer-datensatz-berech-b-ins-update.html)

Artur 3. Feb 2007 21:30

Datenbank: Firebird • Version: 2.0 • Zugriff über: Lokal und über LAN

Firebird: Prüfsumme für Datensatz berech. b. Ins/Update
 
Hallo und guten Abend,

wie würdet Ihr Prüfsummen beim Einfügen oder Ändern von Datensätzen in Firebird berechnen lassen?

Das Ganze brauche ich für den Vergleich von Datenbanken zwischen mehreren Laptops und einem Server.
Eine etwas brutale Methode wäre sicher in einer Schleife alle Felder des Datensatzes auszulesen und dann über irgendeinen Prüfsummenalgorithmus zu berechnen, aber das muss doch auch eleganter gehen.
(Direkt über SQL?)

Könnte man sowas in einer SP verpacken?


Ciao,

Artur

marabu 4. Feb 2007 09:04

Re: Firebird: Prüfsumme für Datensatz berech. b. Ins/Update
 
Herzlich willkommen in der Delphi-PRAXiS, Artur.

Einige Wörter in deinem Beitrag erwecken bei mir den Eindruck, dass du über eine Synchronisierung "verteilter" Datenbanken nachdenkst. Auch wenn das über Hash-Werte denkbar ist, so ist es doch eher unüblich. Ein Ansatz über TimeStamps und identifizierende Schlüssel ist da eher gebräuchlich. Dabei werden dann auch Löschungen sicher erkannt, die bei einem reinen Hash-Ansatz außen vor bleiben würden.

Wenn du aber aus irgendeinem Grund den Ansatz über einen Hash-Wert weiter verfolgen möchtest, dann würde ich BEFORE-INSERT und BEFORE-UPDATE Trigger in Verbindung mit einer UDF für die Hash-Funktion einsetzen. Die relevanten Felder wären dann als Strings zu verketten, so dass ein Hash-Wert über alles berechnet werden kann.

Aber vielleicht kannst du dein Vorhaben etwas genauer beschreiben?

Freundliche Grüße vom marabu

Artur 4. Feb 2007 11:15

Re: Firebird: Prüfsumme für Datensatz berech. b. Ins/Update
 
Hi marabu,

Danke für die Antwort.

Ich habe ein Feld DB_GUID (Varchar[12]) in meinen Tabellen, welches sich aus einer Kennung für den Rechner (4-zeichen) und den Index (8-zeichen Hex als String) zusammensetzt.
Damit kann jeder Datensatz eindeutig identifiziert werden.

Eine Änderung auf dem lokalen Rechner kann ich eindeutig markieren (über Änderungsdatum, Flag, o.ä.), aber wenn mehrere Rechner mit dem Server replizieren, versagen diese Mechanismen auf Server-Seite. Darum will ich beim Anlegen/Ändern des Datensatzes den Hashcode erechnen.

Bei der Replikation kann ich dann aufgrund des systemweit eindeutigen Schlüssel erkennen, ob der Datensatz eingefügt, geändert oder modfiziert wurde. Wenn ich mir die letzte Replikationsliste aufhebe, kann ich sogar erkennen, ob auf beiden Seiten geändert wurde.

Allerdings bin ich mir noch nicht im klaren darüber, wie die Performance dieser Lösung ist, aber ich lerne ja auch noch ;-)

Ciao,

Artur

P.S.: Die Idee war mal für ADS in der Toolbox. Ich hatte erst gehofft, mir das Ganze über fertige Komponenten (z.B. CopyCat, IBReplikator) vom Leibe halten zu können, aber die Tests waren nicht so einfach ud zuverlässig wie gehofft bzw. es muss einiges auf jedem Rechner konfiguriert werden und das kann ich gar nicht gebrauchen (ist für Außendienstler, die so schon ständig ihre Rechner "versauen" und ich bin kein Admin und selbst viel unterwegs).

mkinzler 4. Feb 2007 11:41

Re: Firebird: Prüfsumme für Datensatz berech. b. Ins/Update
 
Dann bieten sich, wie Achim schon erwähnt hat, Trigger an, welche dann automatisch den Hashcode erzeugen und in die entprechende Spalte schreiben. Dies sollte sich auch nicht als all zu performanceschädlich auswirken.

Hansa 4. Feb 2007 12:14

Re: Firebird: Prüfsumme für Datensatz berech. b. Ins/Update
 
Welchen Nutzen bringt denn eine Prüfsumme ? :shock: Versetze mich mal in das Szenario und bin Außendienstler, der gerade in der Zentrale am Server hängt und einen Kunden neu eingibt. Und zwar mit Tippvälrn. Jetzt fahre ich zum Kunden mit vorher überspielten Daten und will ihm was zeigen. Der wird die Fehler in seinen Kundendaten sofort sehen und meckern. Also korrigiere ich das vor Ort. Ein zweiter (neuer) Kunde wurde auch irgendwo vor Ort angelegt. Zurück in der Zentrale werden die Daten vom Notebook übernommen. Und zwar von einer SP, die entscheidet was nötig ist : INSERT oder UPDATE. Bei dem neu angelegten müsste der übernommen werden. Der geänderte könnte über ein TIMESTAMP identifiziert werden. Setzen dieser Timestamps würde ich mit 2 Feldern (angelegt am ,geaendert am) und 2 Triggern machen (siehe Marabu). Hat der mir vor Ort jetzt aus Versehen die falsche Telefonnummer angegeben, ruft in der Zentrale an, ein lieber Kollege korrigiert das vor meiner Rückkehr, allerdings ohne die Tippvälr zu sehen, dann hat er einen neueren geaendert-Timestamp. Nur, was soll da eine Prüfsumme ? Eher wäre eine Richtlinie sinnvoll : keiner hat was an den Daten rumzupfuschen vor Rückkehr der Mitarbeiter. :mrgreen:

Artur 4. Feb 2007 12:53

Re: Firebird: Prüfsumme für Datensatz berech. b. Ins/Update
 
Zu Hansa:

Wenn die Datensätze gesperrt werden, muss der Kollege in der Zentrale den Anruf auf Papier notieren, weil ja der AD noch nicht zurück ist. Auch nicht so prick :?

Nein im Ernst:
a) Die AD kommen 1..2 mal die Woche in die Firma und replizieren nicht jeden Abend. Es ist im voraus nicht 100% klar, wo die sich herumtreiben, weil Kaltbesuche oder kurzfristige Anforderungen durch Kunden vorkommen.
b) Wir haben Gebietsverkäufer, die alle Fabrikate betreuen und zur Unterstützung "Spezialisten" mit einem speziellen Aufgabengebiet, die die gleichen Kunden auch anfahren.
c) Parallel dazu kann es wirklich passieren, dass ein Kunde in der Firma anruft bzw. jemand vom Innendienst von sich aus den Kunden anruft (und wegen einem Projekt nachfragt [wir arbeiten im Bereich Gebäudeinstallation und verkaufen Lichtschalter, Leuchten, Brüstungskanäle und solche Dinge]).

Aus den Gründen kann ich schon keine Datensätze sperren.

Die TimeStamps werden natürlich generiert, aber ich habe keine Kontrolle darüber, ob die Laptops sauber eingestellt sind (kleine Firma ohne Admin => kein Zeitserver, etc., sonst würde ich mich auch nicht mit der Programmierung der DB quälen ;-) ).


Also was soll die Checksum? Wenn die Replikation angestoßen wird, soll das Programm prüfen, ob die aktuelle Checksum auf dem Server die gleiche ist, wie die beim letzten Replizieren. Wenn nicht, gibt es zwei Möglichkeiten:
- am Laptop wurde nix geändert, also her mit den Daten
- am Laptop wurde auch geändert, also irgendeine Fehlerbehandlung für zeitgleich doppelt geänderte Daten
(vermutlich: temp-Datensatz anlegen und Innendienst ein Fenster öffnen, dass er klärt, welche Daten richtig sind)


Zu mkinzler:

Das ist quasi meine Frage: Wie kann ich in SQL so eine Prüfsumme berechnen und bekomme sie in den
Trigger? Händisch über Delphi mit Events der Datasets ist mir das klar: Ich habe eine Procedure die den MD5 aus einem String berechnet. Ich würde alle fgelder des aktiven Datnesatzes als String zusammenknallen und durch die Prozedur laufen lassen und das Feld damit füttern.

Aber in SQL bin ich noch nicht tief genug drin, um so was in der Art zu machen.
Gibt es einen SQL Befehl im Firebird zum Generieren von Checksummen?


Ciao,

Artur

mkinzler 4. Feb 2007 12:55

Re: Firebird: Prüfsumme für Datensatz berech. b. Ins/Update
 
Du hast ja von einem Bericht in der Toolbox geschrieben. Du mußt den Code zur Berechnung in FB-PSQL übersetzen.

mkinzler 4. Feb 2007 12:56

Re: Firebird: Prüfsumme für Datensatz berech. b. Ins/Update
 
Du hast ja von einem Bericht in der Toolbox geschrieben. Du mußt den Code zur Berechnung in FB-PSQL übersetzen.

Artur 4. Feb 2007 13:00

Re: Firebird: Prüfsumme für Datensatz berech. b. Ins/Update
 
Hi mkinzler,

noch ein Nachtrag zur Performance:

die Bedenken sind nicht wegen dem Eintragen / Ändern des Datensatzes, sondern dem Abrufen der Hashcodes und GUIDs für alle Datensätze über DSL. Das Vergleichen selbst ist sicher auch Peanuts.



Ciao,

Artur

Artur 4. Feb 2007 13:25

Re: Firebird: Prüfsumme für Datensatz berech. b. Ins/Update
 
Hi mkinzler,

ich habe mir den Artikel rausgesucht und noch mal angeschaut.
Dort wurde es mit einer Delphi-Funktion gemacht, die in den ADS als externe Binbliothek eingehängt wurde.

Da dass meine Kenntnisse etwas weit übersteigt (ext. Funktionen in Firbird einhängen), werde ich das Problem erstmal so angehen, wie ich es mir vorher gedacht habe (mit "brutalem" Delphi-Code ;-) ).

Vielen Dank für die Mühe und schönen Sonntag.

Ciao,

Artur


P.S.: Hast Du einen Tipp für eine gute SQL Referenz oder ein gutes Buch zu SQL und Firebird?
Da gibt es anscheinend zum MS SQL Server wesentlich mehr im Netz...


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:50 Uhr.
Seite 1 von 2  1 2      

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