AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Firebird: Prüfsumme für Datensatz berech. b. Ins/Update
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Artur · begonnen am 3. Feb 2007 · letzter Beitrag vom 4. Feb 2007
Antwort Antwort
Seite 1 von 2  1 2      
Artur

Registriert seit: 31. Dez 2006
Ort: Augsburg
70 Beiträge
 
Delphi XE8 Enterprise
 
#1

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

  Alt 3. Feb 2007, 21:30
Datenbank: Firebird • Version: 2.0 • Zugriff über: Lokal und über LAN
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
Artur
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

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

  Alt 4. Feb 2007, 09:04
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
  Mit Zitat antworten Zitat
Artur

Registriert seit: 31. Dez 2006
Ort: Augsburg
70 Beiträge
 
Delphi XE8 Enterprise
 
#3

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

  Alt 4. Feb 2007, 11:15
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).
Artur
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

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

  Alt 4. Feb 2007, 11:41
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.
Markus Kinzler
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#5

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

  Alt 4. Feb 2007, 12:14
Welchen Nutzen bringt denn eine Prüfsumme ? 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.
Gruß
Hansa
  Mit Zitat antworten Zitat
Artur

Registriert seit: 31. Dez 2006
Ort: Augsburg
70 Beiträge
 
Delphi XE8 Enterprise
 
#6

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

  Alt 4. Feb 2007, 12:53
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
Artur
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#7

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

  Alt 4. Feb 2007, 12:55
Du hast ja von einem Bericht in der Toolbox geschrieben. Du mußt den Code zur Berechnung in FB-PSQL übersetzen.
Markus Kinzler
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#8

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

  Alt 4. Feb 2007, 12:56
Du hast ja von einem Bericht in der Toolbox geschrieben. Du mußt den Code zur Berechnung in FB-PSQL übersetzen.
Markus Kinzler
  Mit Zitat antworten Zitat
Artur

Registriert seit: 31. Dez 2006
Ort: Augsburg
70 Beiträge
 
Delphi XE8 Enterprise
 
#9

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

  Alt 4. Feb 2007, 13:00
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
  Mit Zitat antworten Zitat
Artur

Registriert seit: 31. Dez 2006
Ort: Augsburg
70 Beiträge
 
Delphi XE8 Enterprise
 
#10

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

  Alt 4. Feb 2007, 13:25
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...
Artur
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 17:53 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