Chad Birch tem uma boa ideia ao usar Acionadores do MySQL e uma função definida pelo usuário . Você pode descobrir mais na MySQL CREATE TRIGGER Syntax referência.
Mas você tem certeza de que precisa chamar um executável imediatamente quando a linha for inserida? Parece que esse método estará propenso a falhas, porque o MySQL pode gerar várias instâncias do executável ao mesmo tempo. Se seu executável falhar, não haverá registro de quais linhas já foram processadas e quais não foram. Se o MySQL estiver esperando que seu executável termine, então a inserção de linhas pode ser muito lenta. Além disso, se Chad Birch estiver certo, então terá que recompilar o MySQL, então parece difícil.
Em vez de chamar o executável diretamente do MySQL, eu usaria gatilhos para simplesmente registrar o fato de que uma linha foi INSERTED ou UPDATED:grave essa informação no banco de dados, seja com novas colunas em suas tabelas existentes ou com uma nova tabela chamada diga
database_changes
. Em seguida, crie um programa externo que leia regularmente as informações do banco de dados, processe-as e marque-as como concluídas. Sua solução específica dependerá de quais parâmetros o programa externo realmente precisa.
Se seu programa externo precisar saber qual linha foi inserida, sua solução pode ser assim:Crie uma nova tabela chamada
database_changes
com campos date
, table_name
e row_id
, e para todas as outras tabelas, faça um gatilho assim: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;
Então seu script em lote pode fazer algo assim:
- Selecione a primeira linha na tabela database_changes.
- Processar.
- Remova.
- Repita 1-3 até
database_changes
está vazio.
Com essa abordagem, você pode ter mais controle sobre quando e como os dados são processados e pode verificar facilmente se os dados realmente foram processados (basta verificar se o
database_changes
tabela está vazia).