Problema: Tengo una tabla que contiene ciertos registros. Una vez realizada la inserción, deseo llamar a un programa externo (script php) a través de las UDS de Sys_ * de MySQL. Ahora, el problema: el desencadenador que tengo pasa la identificación del registro a la secuencia de comandos. Cuando intento extraer los datos mediante el script, obtengo 0 filas. Durante mi propia prueba, llegué a la conclusión de que el desencadenador invoca la secuencia de comandos php y pasa los parámetros ANTES de que se produzca la inserción real, por lo que no obtengo ningún registro para la identificación dada. He probado esto en MySQL 5.0.75 y 5.1.41 (SO Ubuntu). Puedo confirmar que los parámetros se pasan al script antes de que ocurra la inserción real porque he agregado sleep (2); a mi script php y obtuve los datos correctamente. Sin dormir(); declaración, estoy recibiendo 0 registros para la identificación dada.Desencadenadores MySQL - DESPUÉS DE INSERTAR disparador + UDF sys_exec() problema
Mi pregunta es - ¿cómo solucionar este problema sin tener que hardcode algún tipo de retraso dentro del script php? No tengo la libertad de suponer que 2 segundos (o 10 segundos) serán suficiente retraso, por lo que quiero que todo fluya "naturalmente", cuando un comando finaliza, el otro se ejecuta.
Supuse que si el activador es de tipo DESPUÉS DE INSERTAR, todo dentro del cuerpo del desencadenador se ejecutará después de que MySQL realmente inserte los datos.
diseñoTabla:
CREATE TABLE test (
id int not null auto_increment PRIMARY KEY,
random_data varchar(255) not null
);
diseño de disparo:
DELIMITER $$
CREATE TRIGGER `test_after_insert` AFTER INSERT ON `test`
FOR EACH ROW BEGIN
SET @exec_var = sys_exec(CONCAT('php /var/www/xyz/servers/dispatcher.php ', NEW.id));
END;
$$
DELIMITER ;
responsabilidad: Sé que los problemas de seguridad cuando se utiliza la función sys_exec, mi problema es que el MySQL no inserta primero y luego llamar la secuencia de comandos con los parámetros necesarios. Si alguien puede arrojar algo de luz sobre cómo solucionar esto o si tiene un enfoque diferente que no involucre SELECT INTO OUTFILE y usar FAM, estaría muy agradecido. Gracias por adelantado.
Aclare: El script DHCP dispatcher.php se activa, establece una conexión de cliente con su base de datos y luego realiza una consulta. ¿Está bien? –
Se insertan datos. El desencadenador se invoca y pasa la ID a dispatcher.php. Dispatcher.php recupera la fila y la envía al navegador. La razón por la que no envío todos los datos en el inserto es porque los insertaré en una sola tabla, pero extraeré los datos de la vista, por lo que no sé todas las columnas que usaré en un momento dado. – Mihael
Entonces, dispatcher.php tiene su propia conexión de cliente a mySQL? Esto no va a funcionar de manera confiable, porque la transacción de inserción/actualización en la que se ejecuta su desencadenador no está completa hasta que finaliza el desencadenador. Entonces, dispatcher.php ve datos inconsistentes o previos a la transacción. En cualquier caso, es como comer una rebanada de pastel mientras el pastel todavía está en el horno. los desencadenantes deben permanecer dentro del servidor de la base de datos. –