Datenbank-Änderungen nach Refresh schnell ermitteln

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Benutzeravatar
willi4willi
Lazarusforum e. V.
Beiträge: 155
Registriert: Sa 1. Nov 2008, 18:06
OS, Lazarus, FPC: Windows, Linux (debian) / Lazarus 3.2 / FPC 3.2.2
CPU-Target: i386, win64, arm

Datenbank-Änderungen nach Refresh schnell ermitteln

Beitrag von willi4willi »

Hallo!

Ich setze MariaDB und Zeos-Komponenten ein.

Ein Daemon, der in Echtzeit eine Tabelle überwacht, soll, wenn sich ein Feld geändert hat, eine Funktion aufrufen, z.B. ein Signal über TCP senden.

Dazu öffne ich eine Datenbankverbindung und führe in einer Schleife einen Refresh durch.

Wenn sich irgendein Feldihnalt in der Datenbank geändert hat, dann soll es passieren.

Gut wäre auch zu wissen, welches Feld oder welche Felder davon betroffen sind.


Code: Alles auswählen

 
 
var Query : TZQuery;
 
begin
  Query := TZQuery.Create;
  try
    Query .SQL.Text:='SELECT * FROM `Tabelle` WHERE `aktiv` = 1  ; ';
    Query .Open;
    repeat
       KonfQuery.Refresh;
 
      If  ("hat sich was geändert") then ("mache etwas");
 
    until keypressed;
  finally
    KonfQuery.Free;
  end;
end;
 
 
 


Ich kann dafür kein Event oder eine Funktion finden. Weiß jemand, ob es da etwas gibt oder muss ich mir jedesmal alle Felder-Inhalte merken, um danach zu testen, ob sich ein Feld geändert hat?

Ich möchte möglichst auf die zwei Schleifen verzichten, da das u.U. zu viel Rechenzeit verbraucht.
 

Viele Grüße

Willi4Willi

------------

MmVisual
Beiträge: 1437
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: Datenbank-Änderungen nach Refresh schnell ermitteln

Beitrag von MmVisual »

Man kann sich ein Feld in der Tabelle anlegen:

ALTER TABLE `Tabelle` ADD `AendDatum` TIMESTAMP on update CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP

Jedes mal wenn eine Datensatz-Zeile geändert wird schreibt MariaDB automatisch die aktuelle Zeit in die Spalte AendDatum

Nun braucht man nur noch die Tabelle abfragen mit:

SELECT * FROM Tabelle WHERE aktiv=1 AND AendDatum> :LastDatum

Query.ParamByName('LastDatum').AsDateTime := dtLetztes Datum;
EleLa - Elektronik Lagerverwaltung - www.elela.de

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Datenbank-Änderungen nach Refresh schnell ermitteln

Beitrag von pluto »

Ich hatte auch schon, was ähnliches vor, habe es aber nicht weiter verfolgt...
Du könntest es über trigger versuchen. Der Server könnte die Änderungen in eine Datei schreiben, die du vom Linux Kernel aus überwachen kannst(Dafür gibt es einige Möglichkeiten). Zum Beispiel:
https://wiki.ubuntuusers.de/inotify/
Das geht sehr schnell. Wäre bestimmt eine erste Möglichkeit, statt die ganze Tabelle durch zu laufen.
Wenn sich die Datei geändert hat, könntest du über nc(netcat) ein Signal an dein TCP Server übermitteln.

Eine zweite Variante könnte sein:
Immer nur den letzten Datensatz zu ermitteln, der zu letzt eingefügt wurde. Die ID, kannst du mit der gespeicherten ID vergleichen.
MFG
Michael Springwald

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6197
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Datenbank-Änderungen nach Refresh schnell ermitteln

Beitrag von af0815 »

Es ist IMHO eine misbräuchliche Verwendung einer DB. Sorry ist meine Meinung nach den vorliegenden Daten. Vor allen, falls das nicht auf derselben Maschine ist.

Wenn es halbwegs sauber gehen soll, einen Trigger und eine UDF schreiben. Siehe auch https://dev.mysql.com/doc/refman/8.0/en ... iggers-udf

Alles andere ist nur Stress für die DB Connection. Es ist und bleibt polling ūber die Connection.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
willi4willi
Lazarusforum e. V.
Beiträge: 155
Registriert: Sa 1. Nov 2008, 18:06
OS, Lazarus, FPC: Windows, Linux (debian) / Lazarus 3.2 / FPC 3.2.2
CPU-Target: i386, win64, arm

Re: Datenbank-Änderungen nach Refresh schnell ermitteln

Beitrag von willi4willi »

af0815:

Code: Alles auswählen

Es ist IMHO eine misbräuchliche Verwendung einer DB.

Ja, das ist wohl war. Trigger und UDF sind sicherlich eine bessere Lösung, aber auch etwas komplizierter.

Ich dachte, dass es vielleicht eine Funkton/Methode/Event gibt, die nach einem Refresh zurückgibt, dass sich der Inhalt des Querys verändert hat oder nicht.

Ich habe die Variante von MmVisual ausprobiert. Sie machte das, wass ich bezweckt hatte und ist absolut simpel.

Danke an alle für die Tipps!
 

Viele Grüße

Willi4Willi

------------

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Datenbank-Änderungen nach Refresh schnell ermitteln

Beitrag von pluto »

Ja, das ist wohl war. Trigger und UDF sind sicherlich eine bessere Lösung, aber auch etwas komplizierter.

Für ein Projekt habe ich eine DB mit Trigger erzeugt aus Pascal heraus ging sehr gut.... Was UDF angeht, damit habe ich mich noch nicht befasst.

Ich dachte, dass es vielleicht eine Funkton/Methode/Event gibt, die nach einem Refresh zurückgibt, dass sich der Inhalt des Querys verändert hat oder nicht.

Ich habe auch schon danach gesucht, konnte aber keine Finden. Es gibt wohl Datenbanken, die haben sowas.

Wäre für einige Anwendungen echt Praktisch. ich frage mich warum es sowas noch nicht gibt bei der MariaDB/MySQL Datenbank?
MFG
Michael Springwald

Benutzeravatar
willi4willi
Lazarusforum e. V.
Beiträge: 155
Registriert: Sa 1. Nov 2008, 18:06
OS, Lazarus, FPC: Windows, Linux (debian) / Lazarus 3.2 / FPC 3.2.2
CPU-Target: i386, win64, arm

Re: Datenbank-Änderungen nach Refresh schnell ermitteln

Beitrag von willi4willi »

Ich denke mal, das sollte weniger mit der Datenbank zusammenhängen, sondern ehrer eine Funktion der TZQuery sein.

Eine Funktion, die die Daten vor dem Refresh mit den Daten nach dem Refresh vergleicht und bei einem Unterschied ein TRUE zurückgibt.

Man kann das ja programmieren, indem man das bei BeforeRefresh die Inhalte aller Felder abspeichert und dann diese mit den Feldern nach dem Refresh (bei AfterRefresh) vergleicht.
Gibt es einen Unterschied, so gibt man TRUE zurück und vielleicht auch eine Liste, welche Felder andere Werte haben.

Nur das dauert zu lange, wenn man da durch die Schleifen wandert um alles zu testen.

Wenn eine Datenbank von sich aus mitteilen kann, ob sich die Daten eines Querys sich auf dem Server geändert haben, dann wäre das natürlich noch besser.
 

Viele Grüße

Willi4Willi

------------

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Datenbank-Änderungen nach Refresh schnell ermitteln

Beitrag von MacWomble »

Mir fällt in diesem Zusammenhang ein, dass ich vor Jahren unter ms mit VisualBasic die Acces-Datenbank über das Setzen des Cursors (lokal oder Datenbank) dazu bewegen konnte, Änderungen auf anderen Rechnern direkt (ohne Refresh etc) anzuzeigen. D.h. die Daten wurden in der Maske des entfernten Programms aktualisiert, sobald diese in die DB geschrieben wurden. Gibt es so eine Möglchkeit hier nicht?
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

MmVisual
Beiträge: 1437
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: Datenbank-Änderungen nach Refresh schnell ermitteln

Beitrag von MmVisual »

Nein. Das hier ist weder Access noch Visual Basic. Es ist eine Spezialfunktion von Microsoft.
EleLa - Elektronik Lagerverwaltung - www.elela.de

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Datenbank-Änderungen nach Refresh schnell ermitteln

Beitrag von MacWomble »

... man fragt halt - Danke
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Antworten