sql >> Base de Datos >  >> RDS >> Mysql

Cuando se agrega una nueva fila en la base de datos, se debe invocar un programa de línea de comando externo

Chad Birch tiene una buena idea al usar Disparadores de MySQL y una función definida por el usuario . Puede obtener más información en la Sintaxis de MySQL CREATE TRIGGER referencia.

Pero, ¿está seguro de que necesita llamar a un ejecutable de inmediato cuando se inserta la fila? Parece que ese método será propenso a fallar, porque MySQL podría generar varias instancias del ejecutable al mismo tiempo. Si su ejecutable falla, entonces no habrá registro de qué filas se han procesado todavía y cuáles no. Si MySQL está esperando a que finalice su ejecutable, la inserción de filas puede ser muy lenta. Además, si Chad Birch tiene razón, tendrá que volver a compilar MySQL, por lo que suena difícil.

En lugar de llamar al ejecutable directamente desde MySQL, usaría disparadores para simplemente registrar el hecho de que una fila se INSERTÓ o ACTUALIZÓ:registre esa información en la base de datos, ya sea con nuevas columnas en sus tablas existentes o con una nueva tabla llamada digamos database_changes . Luego haga un programa externo que lea regularmente la información de la base de datos, la procese y la marque como completada.

Su solución específica dependerá de los parámetros que realmente necesite el programa externo.

Si su programa externo necesita saber qué fila se insertó, entonces su solución podría ser así:cree una nueva tabla llamada database_changes con campos date , table_name y row_id , y para todas las demás tablas, haga un activador como este:

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;

Entonces su secuencia de comandos por lotes puede hacer algo como esto:

  1. Seleccione la primera fila en la tabla database_changes.
  2. Procesarlo.
  3. Eliminarlo.
  4. Repita 1-3 hasta database_changes está vacío.

Con este enfoque, puede tener más control sobre cuándo y cómo se procesan los datos, y puede verificar fácilmente si los datos realmente se procesaron (solo verifique si database_changes la mesa está vacía).