Chad Birch ha una buona idea con l'utilizzo di Trigger MySQL e una funzione definita dall'utente . Puoi saperne di più nella Sintassi di MySQL CREATE TRIGGER riferimento.
Ma sei sicuro di dover chiamare subito un eseguibile quando viene inserita la riga? Sembra che quel metodo sia soggetto a errori, perché MySQL potrebbe generare più istanze dell'eseguibile contemporaneamente. Se il tuo eseguibile ha esito negativo, non ci sarà alcun record di quali righe sono state ancora elaborate e quali no. Se MySQL sta aspettando il completamento dell'eseguibile, l'inserimento di righe potrebbe essere molto lento. Inoltre, se Chad Birch ha ragione, dovrà ricompilare MySQL, quindi sembra difficile.
Invece di chiamare l'eseguibile direttamente da MySQL, userei i trigger per registrare semplicemente il fatto che una riga è stata INSERITA o AGGIORNATA:registra tali informazioni nel database, con nuove colonne nelle tabelle esistenti o con una tabella nuova di zecca chiamata say database_changes
. Quindi crea un programma esterno che legga regolarmente le informazioni dal database, le elabori e le segni come completate.
La tua soluzione specifica dipenderà dai parametri effettivamente necessari al programma esterno.
Se il tuo programma esterno ha bisogno di sapere quale riga è stata inserita, la tua soluzione potrebbe essere questa:crea una nuova tabella chiamata database_changes
con i campi date
, table_name
e row_id
, e per tutte le altre tabelle, crea un trigger come questo:
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;
Quindi il tuo script batch può fare qualcosa del genere:
- Seleziona la prima riga nella tabella database_changes.
- Elaboralo.
- Rimuovilo.
- Ripeti 1-3 fino a
database_changes
è vuoto.
Con questo approccio, puoi avere un maggiore controllo su quando e come i dati vengono elaborati e puoi facilmente verificare se i dati sono stati effettivamente elaborati (basta controllare se il database_changes
la tabella è vuota).