Chad Birch heeft een goed idee met het gebruik van MySQL-triggers en een door de gebruiker gedefinieerde functie . U kunt meer informatie vinden in de MySQL CREATE TRIGGER-syntaxis referentie.
Maar weet u zeker dat u meteen een uitvoerbaar bestand moet aanroepen wanneer de rij wordt ingevoegd? Het lijkt erop dat die methode vatbaar is voor fouten, omdat MySQL meerdere exemplaren van het uitvoerbare bestand tegelijkertijd kan voortbrengen. Als uw uitvoerbare bestand faalt, wordt er niet geregistreerd welke rijen al zijn verwerkt en welke niet. Als MySQL wacht tot uw uitvoerbare bestand is voltooid, kan het invoegen van rijen erg traag zijn. Als Chad Birch gelijk heeft, moet hij MySQL opnieuw compileren, dus het klinkt moeilijk.
In plaats van het uitvoerbare bestand rechtstreeks vanuit MySQL aan te roepen, zou ik triggers gebruiken om eenvoudig het feit vast te leggen dat een rij is INSERTED of UPDATED:neem die informatie op in de database, ofwel met nieuwe kolommen in uw bestaande tabellen of met een geheel nieuwe tabel met de naam say database_changes
. Maak vervolgens een extern programma dat regelmatig de informatie uit de database leest, verwerkt en markeert als voltooid.
Uw specifieke oplossing hangt af van de parameters die het externe programma daadwerkelijk nodig heeft.
Als uw externe programma moet weten welke rij is ingevoegd, dan zou uw oplossing als volgt kunnen zijn:Maak een nieuwe tabel met de naam database_changes
met velden date
, table_name
, en row_id
, en voor alle andere tabellen, maak een trigger als volgt:
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;
Dan kan je batchscript zoiets als dit doen:
- Selecteer de eerste rij in de tabel database_changes.
- Verwerk het.
- Verwijder het.
- Herhaal 1-3 tot
database_changes
is leeg.
Met deze aanpak heeft u meer controle over wanneer en hoe de gegevens worden verwerkt, en kunt u eenvoudig controleren of de gegevens daadwerkelijk zijn verwerkt (controleer gewoon of de database_changes
tafel is leeg).