Datenbank-Änderungen nach Refresh schnell ermitteln

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.

Datenbank-Änderungen nach Refresh schnell ermitteln

Beitragvon willi4willi » 9. Jan 2019, 20:36 Datenbank-Änderungen nach Refresh schnell ermitteln

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

------------
willi4willi
 
Beiträge: 112
Registriert: 1. Nov 2008, 18:06
OS, Lazarus, FPC: Windows (10), Linux (debinan) / FPC 3.0.4 / Lazarus 1.8.4 | 
CPU-Target: i386, win64, arm
Nach oben

Beitragvon MmVisual » 9. Jan 2019, 21:14 Re: Datenbank-Änderungen nach Refresh schnell ermitteln

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;
MmVisual
 
Beiträge: 1022
Registriert: 10. Okt 2008, 22:54
OS, Lazarus, FPC: Winux (L 1.6 FPC 3) | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon pluto » 9. Jan 2019, 21:40 Re: Datenbank-Änderungen nach Refresh schnell ermitteln

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
Aktuelles Projekt: PlutoArduino
pluto
 
Beiträge: 6826
Registriert: 19. Nov 2006, 12:06
Wohnort: Oldenburg/Oldenburg
OS, Lazarus, FPC: Linux Mint 18.3 | 
CPU-Target: AMD
Nach oben

Beitragvon af0815 » 9. Jan 2019, 22:05 Re: Datenbank-Änderungen nach Refresh schnell ermitteln

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).
af0815
 
Beiträge: 3528
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: FPC 3.2 Lazarus 2.0 per fpcupdeluxe | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon willi4willi » 11. Jan 2019, 13:42 Re: Datenbank-Änderungen nach Refresh schnell ermitteln

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

------------
willi4willi
 
Beiträge: 112
Registriert: 1. Nov 2008, 18:06
OS, Lazarus, FPC: Windows (10), Linux (debinan) / FPC 3.0.4 / Lazarus 1.8.4 | 
CPU-Target: i386, win64, arm
Nach oben

Beitragvon pluto » 11. Jan 2019, 13:54 Re: Datenbank-Änderungen nach Refresh schnell ermitteln

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
Aktuelles Projekt: PlutoArduino
pluto
 
Beiträge: 6826
Registriert: 19. Nov 2006, 12:06
Wohnort: Oldenburg/Oldenburg
OS, Lazarus, FPC: Linux Mint 18.3 | 
CPU-Target: AMD
Nach oben

Beitragvon willi4willi » 11. Jan 2019, 14:17 Re: Datenbank-Änderungen nach Refresh schnell ermitteln

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

------------
willi4willi
 
Beiträge: 112
Registriert: 1. Nov 2008, 18:06
OS, Lazarus, FPC: Windows (10), Linux (debinan) / FPC 3.0.4 / Lazarus 1.8.4 | 
CPU-Target: i386, win64, arm
Nach oben

Beitragvon MacWomble » 11. Jan 2019, 14:22 Re: Datenbank-Änderungen nach Refresh schnell ermitteln

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.
MacWomble
 
Beiträge: 700
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 19 Cinnamon / CodeTyphon Generation V Plan 6.60 | 
CPU-Target: Intel i7 64/32 Bit
Nach oben

Beitragvon MmVisual » 11. Jan 2019, 14:38 Re: Datenbank-Änderungen nach Refresh schnell ermitteln

Nein. Das hier ist weder Access noch Visual Basic. Es ist eine Spezialfunktion von Microsoft.
MmVisual
 
Beiträge: 1022
Registriert: 10. Okt 2008, 22:54
OS, Lazarus, FPC: Winux (L 1.6 FPC 3) | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon MacWomble » 12. Jan 2019, 10:49 Re: Datenbank-Änderungen nach Refresh schnell ermitteln

... man fragt halt - Danke
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
MacWomble
 
Beiträge: 700
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 19 Cinnamon / CodeTyphon Generation V Plan 6.60 | 
CPU-Target: Intel i7 64/32 Bit
Nach oben

• Themenende •

Zurück zu Datenbanken



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste

porpoises-institution
accuracy-worried