Mysql
 sql >> Base de données >  >> RDS >> Mysql

Lorsqu'une nouvelle ligne dans la base de données est ajoutée, un programme de ligne de commande externe doit être appelé

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 :

  1. Sélectionnez la première ligne de la table database_changes.
  2. Traitez-le.
  3. Retirez-le.
  4. 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).