Chad Birch a une bonne idée d'utiliser Déclencheurs MySQL et une fonction définie par l'utilisateur . Vous pouvez en savoir plus dans la Syntaxe MySQL CREATE TRIGGER référence.
Mais êtes-vous sûr de devoir appeler un exécutable immédiatement lorsque la ligne est insérée ? Il semble que cette méthode soit sujette à l'échec, car MySQL peut générer plusieurs instances de l'exécutable en même temps. Si votre exécutable échoue, il n'y aura aucun enregistrement des lignes qui ont déjà été traitées et de celles qui ne l'ont pas été. Si MySQL attend que votre exécutable se termine, l'insertion de lignes peut être très lente. De plus, si Chad Birch a raison, il devra alors recompiler MySQL, donc cela semble difficile.
Au lieu d'appeler l'exécutable directement depuis MySQL, j'utiliserais des déclencheurs pour enregistrer simplement le fait qu'une ligne a été INSÉRÉE ou MIS À JOUR :enregistrez ces informations dans la base de données, soit avec de nouvelles colonnes dans vos tables existantes, soit avec une toute nouvelle table appelée say database_changes
. Créez ensuite un programme externe qui lit régulièrement les informations de la base de données, les traite et les marque comme terminées.
Votre solution spécifique dépendra des paramètres dont le programme externe a réellement besoin.
Si votre programme externe a besoin de savoir quelle ligne a été insérée, votre solution pourrait ressembler à ceci :Créez une nouvelle table appelée database_changes
avec les champs date
, table_name
, et row_id
, et pour toutes les autres tables, créez un déclencheur comme celui-ci :
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;
Ensuite, votre script batch peut faire quelque chose comme ceci :
- Sélectionnez la première ligne de la table database_changes.
- Traitez-le.
- Retirez-le.
- Répétez 1-3 jusqu'à
database_changes
est vide.
Avec cette approche, vous pouvez avoir plus de contrôle sur le moment et la manière dont les données sont traitées, et vous pouvez facilement vérifier si les données ont réellement été traitées (vérifiez simplement si le database_changes
le tableau est vide).