Batch oder EXE starten bei bestimmten MySQL Vorgängen.

Delphis1982

Neuer Benutzer
Beiträge
3
Hallöchen in die Runde,

als Neuling kurze Vorstellung.
Mein Name ist David, bin 41, betreibe eine Datenbank zu Hause für die Hausautomatisierung.
Es läuft alles lokal und ohne Cloud (die Cloud bin ICH).
Als Datenbank habe ich die MariaDB in der Version 10.11.2 unter Windows Server 2016 Standard zu laufen (ja, ist dennoch alles privat).
Wenn ich zu Hause meinen PIN eingebe, um die Alarmanlage zu deaktivieren, wird ein Zeitstempel in die Datenbank geschrieben.
User X betritt am 29.02.2023 um 25:12h das Gebäude (Datum und Uhrzeit sind natürlich Murks, sollen ja auch n ur ein Beispiel darstellen).
Nun möchte ich, dass bei bestimmten Ereignissen ein kleines Progrämmchen oder eine Batch gestartet wird (es reichen User-Rechte).
Ist das überhaupt machbar?
Ich möchte unter anderem, dass wenn ich mich zu Hause an der Tür einlogge, ein Wake on LAN Befehl an meinen PC gesendet wird.
Ich hoffe, ich habe genug Infos bereitgestellt. Wenn nicht, einfach Bescheid geben.
Ich bin durchaus offen für "polnische" Lösungen, Gefrickel und Gebastel schrecken mich da nicht ab.

Danke schonmal im Voraus, auch, wenn die Antwort negativ ausfallen sollte.
 
Werbung:
Du könntest via TRIGGER etwas auslösen. Z.B. einen Eintrag in eine Jobtabelle schreiben. Dazu ein Daemon, der extern läuft und diese Tabelle regelmäßig abfragt (z.B. via CRON) oder via LISTEN&NOTIFY die Tabelle überwacht und etwas auslöst.
 
Nun da es ein Event in der Datenbank gibt (schreiben eines Datensatzes) kannst du relativ gut einen Trigger auslösen. Du musst dann allerdings aus dem Kontext der Datenbank raus auf Betriebssystemebene. Das geht erstmal nicht mehr allein mit SQL und das ist je nach DBMS sehr spezifisch. Häufig können andere Programmiersprachen in SQL Code eingebettet werden oder es gibt eigene Funktionen um z.B. auf das lokale OS zu kommen, leider kenne ich mich mit MariaDB da so gar nicht aus.
 
Dass ich wahrscheinlich auf OS Ebene arbeiten muss, dachte ich mir leider schon.
Die Trigger sind da nicht geeignet, da sie nicht in der Lage sind, einen Befehl auf OS-Ebene abzusetzen, sondern nur Datenbankbefehle.
Das kenne ich von MS-SQL, da kann mittels Agent ein externes Programm gestartet werden, aber MySQL lässt diese Funktion leider vermissen.
Wenn es keine direkte Möglichkeit gibt, wird es wohl doch nur über Umwege gehen.
Denke da eher an sowas wie, dass jede Minute eine Batch gestartet wird, die folgendes macht:
1. Von einer bestimmten Tabelle wird ein Dump gemacht.
2. Direkt danach wird mittels findstr nach dem jüngsten Zeitstempel gesucht.
3. IF-Schleife: ist dieser Zeitstempel jünger als 2 Minuten und die betreffende Zeile enthält den Begriff LOGIN, dann starte Programm blablabla.exe.
4. Lösche den Dump.
5. Batch ende.

Und das wiederholt sich quasi jede Minute.

Da der Export ja im Klartext vorliegt, müsste das eigentlich machbar sein.

Dass beim Backup die Datenbank kurz gelockt ist, damit werde ich natürlich leben müssen, sind aber wahrscheinlich nur Bruchteile einer Sekunde.

Könnte das so funktionieren?
Wenn ja, dann wird das hier ein sehr kurzer Faden, aber ich wollte auf Nummer sicher gehen, dass mir nichts entfallen ist
oder ich eine entsprechende vorhandene Funktion übersehen habe.
Google und SuFu haben mir nichts passendes geliefert, daher die Verzweiflungsfrage.
 
Dass ich wahrscheinlich auf OS Ebene arbeiten muss, dachte ich mir leider schon.
Die Trigger sind da nicht geeignet, da sie nicht in der Lage sind, einen Befehl auf OS-Ebene abzusetzen, sondern nur Datenbankbefehle.

Faktisch korrekt, nur die Schlußfolgerung ist falsch,

Das kenne ich von MS-SQL, da kann mittels Agent ein externes Programm gestartet werden, aber MySQL lässt diese Funktion leider vermissen.
Wenn es keine direkte Möglichkeit gibt, wird es wohl doch nur über Umwege gehen.
Denke da eher an sowas wie, dass jede Minute eine Batch gestartet wird, die folgendes macht:
1. Von einer bestimmten Tabelle wird ein Dump gemacht.
2. Direkt danach wird mittels findstr nach dem jüngsten Zeitstempel gesucht.
3. IF-Schleife: ist dieser Zeitstempel jünger als 2 Minuten und die betreffende Zeile enthält den Begriff LOGIN, dann starte Programm blablabla.exe.
4. Lösche den Dump.
5. Batch ende.

Und das wiederholt sich quasi jede Minute.

siehe #2
tl;dr : es geht einfacher & effektiver

Da der Export ja im Klartext vorliegt, müsste das eigentlich machbar sein.

Dass beim Backup die Datenbank kurz gelockt ist, damit werde ich natürlich leben müssen, sind aber wahrscheinlich nur Bruchteile einer Sekunde.

Das mit dem lock beim Dump gilt nur für Systeme aus dem EDV-Steinzeitalter.


Könnte das so funktionieren?
Wenn ja, dann wird das hier ein sehr kurzer Faden, aber ich wollte auf Nummer sicher gehen, dass mir nichts entfallen ist
oder ich eine entsprechende vorhandene Funktion übersehen habe.
Google und SuFu haben mir nichts passendes geliefert, daher die Verzweiflungsfrage.
 
Du musst ja keinen Dump von einer ganzen Datenbank oder einer ganzen Tabelle machen um dann mit irgendwelchen Schleifen Datensätze da drinne zu suchen, es gibt ja auch noch die Möglichkeit eine Abfrage auf eine Datenbank zu machen. Genau dafür ist die ja da, nur die Daten zu liefern die man haben möchte und das kann man i.d.R. auch als Datensatz exportieren. Faktisch willst du ja eigentlich nur schauen ob das Event innerhalb eines Zeitraums X in der Tabelle steht und wenn dem so ist ein TRUE abfragen. Das läßt sich sicherlich auch ohne Exportdatei direkt innerhalb eines Batches lösen.
 
@ukulele
Das wäre natürlich eleganter.
Werde ich dann zu Hause mal schauen, wie ich dasbso bewerkstelligen kann.
Werde natürlich auch berichten, ob das was gebracht hat oder nicht.
Ich hatte aber nicht vor, einen vollständigen Dump zu machen, sondern nur von dem Bereich, den es betrifft.
Da reden wir von ein paar Kilobytes, nicht der Rede wert.
Aber hast Recht, ein gezielter Zugriff ist viel eleganter.

@tk1234
Die Alarmanlage selber macht keinen Zeitstempel, sondern sendet lediglich bestimmte Pegel über die GPIO Anschlüsse.
Diese werden dann von einem Raspi entsprechend interpretiert und dieser kann dann MySQL Befehle absetzen, hat mich eine Heiden Fummelei gekostet, funktioniert aber.
Der Raspi ist aber natürlich nicht in der Lage, auf einem anderen PC ein Programm zu starten, zumindest wüsste ich derzeit keine entsprechende Methode.
Ich hatte mal versucht, den Raspi direkt dazu zu bewegen, den WoL Befehl zu senden, aber das klappt offenbar nur, wenn ich per USB einen LAN-Adapter anschließe.
Als Dauerlösung an der Stelle leider indiskutabel. Bleibt nur WLAN, aber da werden die Pakete offenbar nicht gesendet, daher dieser Workaround.
 
Werbung:
Mglw. bekommst Du WoL über Deinen DSL Router hin (der immer an ist) und eine entsprechende Option anbietet per LAN.
Bastelidee: FunkIP Aktor, der einen rausgeschleiften ACPI Taster am PC ansteuert.

Ansonsten könntest Du auch alle Events die am Raspberry auflaufen schlicht in eine Datei puffern, die der PC einfach einliest, wenn/solange er an ist (Polling) und dann löscht. Ist für einen echten Alarmfall natürlich suboptimal.
 
Zurück
Oben