Chad Birch har en bra idé med att använda MySQL-utlösare och en användardefinierad funktion . Du kan ta reda på mer i MySQL CREATE TRIGGER-syntax a> referens.
Men är du säker på att du behöver anropa en körbar fil direkt när raden infogas? Det verkar som om den metoden kommer att misslyckas, eftersom MySQL kan skapa flera instanser av den körbara filen samtidigt. Om din körbara fil misslyckas, kommer det inte att finnas några uppgifter om vilka rader som har bearbetats ännu och vilka som inte har gjort det. Om MySQL väntar på att din körbara fil ska slutföras, kan det gå mycket långsamt att infoga rader. Dessutom, om Chad Birch har rätt, måste du kompilera om MySQL, så det låter svårt.
Istället för att anropa den körbara filen direkt från MySQL, skulle jag använda triggers för att helt enkelt registrera det faktum att en rad infördes eller uppdaterades:registrera den informationen i databasen, antingen med nya kolumner i dina befintliga tabeller eller med en helt ny tabell som heter say database_changes
. Gör sedan ett externt program som regelbundet läser informationen från databasen, bearbetar den och markerar den som klar.
Din specifika lösning kommer att bero på vilka parametrar det externa programmet faktiskt behöver.
Om ditt externa program behöver veta vilken rad som infogades kan din lösning vara så här:Gör en ny tabell som heter database_changes
med fälten date
, table_name
och row_id
, och för alla andra tabeller, gör en trigger så här:
CREATE TRIGGER `my_trigger`
AFTER INSERT ON `table_name`
FOR EACH ROW BEGIN
INSERT INTO `database_changes` (`date`, `table_name`, `row_id`)
VALUES (NOW(), "table_name", NEW.id)
END;
Då kan ditt batchskript göra något så här:
- Välj den första raden i tabellen database_changes.
- Bearbeta det.
- Ta bort den.
- Upprepa 1-3 tills
database_changes
är tom.
Med detta tillvägagångssätt kan du ha mer kontroll över när och hur data bearbetas, och du kan enkelt kontrollera om uppgifterna faktiskt har bearbetats (kontrollera bara om database_changes
tabellen är tom).