Триггеры MySQL - ПОСЛЕ ВСТАВКИ триггера + UDF sys_exec () проблема

Проблема: у меня есть таблица, в которой хранятся определенные записи. После завершения вставки я хочу вызвать внешнюю программу (скрипт php) через MySQL sys_ * UDF. Теперь проблема - триггер, который у меня есть, передает скрипту идентификатор записи. Когда я пытаюсь вытащить данные через скрипт, я получаю 0 строк. Во время собственного тестирования я пришел к выводу, что триггер вызывает php-скрипт и передает параметры ДО того, как произошла фактическая вставка, поэтому я не получаю записей для данного идентификатора. Я тестировал это на MySQL 5.0.75 и 5.1.41 (ОС Ubuntu). Я могу подтвердить, что параметры передаются в сценарий до фактической вставки, потому что я добавил sleep (2); в мой php-скрипт, и я правильно получил данные. Без сна(); , я получаю 0 записей для данного идентификатора.

У меня вопрос - как исправить эту проблему, не прибегая к жесткому кодированию какой-либо задержки в php-скрипте? У меня нет права предполагать, что 2 секунды (или 10 секунд) будут достаточной задержкой, поэтому я хочу, чтобы все шло «естественно», когда одна команда завершается - другая запускается.

Я предположил, что если триггер имеет тип AFTER INSERT, все в теле триггера будет выполнено после того, как MySQL фактически вставит данные.

Макет таблицы:

CREATE TABLE test (
id int not null auto_increment PRIMARY KEY,
random_data varchar(255) not null
);

Макет триггера:

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 ;

Отказ от ответственности: я знаю проблемы безопасности при использовании функции sys_exec , моя проблема в том, что MySQL не вставляет ПЕРВЫЙ, а ЗАТЕМ вызывает скрипт с необходимыми параметрами. Если кто-нибудь может пролить свет на то, как это исправить, или у него есть другой подход, который не включает SELECT INTO OUTFILE и использование FAM, я был бы очень признателен. Заранее спасибо.

8
задан Mihael 6 September 2010 в 15:19
поделиться