Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Quando uma nova linha no banco de dados é adicionada, um programa de linha de comando externo deve ser invocado


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:
  1. Selecione a primeira linha na tabela database_changes.
  2. Processar.
  3. Remova.
  4. 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).