2009-03-21 2 views
2

Est-il possible que la base de données MySQL appelle un fichier exe externe lorsqu'une nouvelle ligne est ajoutée à l'une des tables de la base de données?Lorsqu'une nouvelle ligne dans la base de données est ajoutée, un programme de ligne de commande externe doit être appelé

J'ai besoin de surveiller les changements dans la base de données, donc quand une modification pertinente est faite, j'ai besoin de faire des travaux par lots en dehors de la base de données.

+0

Peut-être que cela vous aide: http://stackoverflow.com/questions/40025369/how-to-execute-external-script-app-command-from-mysql-server –

+0

même chose dont j'ai besoin. plz m'aider à faire cela? je veux appeler exe depuis mon trigger mysql @Graviton – Karthi

Répondre

4
  1. vous pouvez faire ce que la réplication ne: accrocher sur le « log binaire ». configurez votre serveur en tant que «serveur maître» et, au lieu d'ajouter un «serveur esclave», exécutez mysqlbinlog. vous obtiendrez un flux de chaque commande qui modifie votre base de données.

    • étape entre le client et le serveur: vérifiez MySQLProxy. vous le pointez sur votre serveur et pointez votre client sur le proxy. il vous permet d'interposer des scripts Lua pour surveiller, analyser ou transformer n'importe quelle commande SQL.
12

Tchad Birch a une bonne idée à l'utilisation MySQL triggers and a user-defined function. Vous pouvez en savoir plus dans la référence MySQL CREATE TRIGGER Syntax. Mais êtes-vous sûr de devoir appeler immédiatement un exécutable lorsque la ligne est insérée? Il semble que cette méthode sera 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 été traitées et celles qui ne l'ont pas encore été. Si MySQL attend la fin de votre exécutable, l'insertion de lignes risque d'être très lente. Aussi, si Chad Birch a raison, il devra alors recompiler MySQL, donc cela semble difficile. Au lieu d'appeler l'exécutable directement à partir de MySQL, j'utiliserais des déclencheurs pour enregistrer simplement le fait qu'une ligne a été INSÉRÉE ou UPDATED: enregistrer cette information dans la base de données, soit avec de nouvelles colonnes dans vos tables existantes, soit avec un tout nouveau table appelée 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: Faire une nouvelle table appelée database_changes avec des champs date, table_name et row_id, et pour toutes les autres tables, faire un déclencheur comme ceci:

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'à ce que database_changes soit vide.

Avec cette approche, vous pouvez avoir plus de contrôle sur quand et comment les données ont été traitées, et vous pouvez facilement vérifier si les données réellement obtenu traitées (vérifier juste pour voir si la table database_changes est vide).

+2

Rien ne vous empêche de combiner cela avec l'exécution d'un exec qui éveille le programme de surveillance. Ainsi, le moniteur peut faire une vérification automatique toutes les 5 minutes, ou vérifier quand il reçoit un signal. – Brimstedt

+0

À mon humble avis, ceci est une architecture plus robuste que l'accrochage de la DB; en particulier pour les tâches à long terme ou les tâches qui peuvent échouer (par exemple, tout ce qui implique un réseau). Bien sûr, ce n'est pas ce qui a été demandé, mais ce sera généralement la meilleure réponse. – Javier

0

Je pense qu'il est vraiment BEAUCOUP meilleur d'avoir des changements de sondage de processus externes à la table et d'exécuter le programme externe - vous pouvez également avoir une colonne qui contient le statut de ce programme externe (par exemple "pending", " failed "," success ") - et sélectionnez simplement les lignes où cette colonne est" en attente ".

Cela dépend du délai d'exécution du travail par lots. Si c'est quelque chose qui doit être exécuté "tôt ou tard" et peut échouer et doit être réessayé, certainement avoir une application interrogeant la table et les exécutant si nécessaire.

Questions connexes