У Чада Бёрча хорошая идея использовать триггеры MySQL и пользовательскую функцию . Вы можете узнать больше в справочнике MySQL CREATE TRIGGER .
Но уверены ли вы, что вам нужно вызывать исполняемый файл сразу после вставки строки? Похоже, что этот метод будет подвержен сбоям, потому что MySQL может порождать несколько экземпляров исполняемого файла одновременно. Если ваш исполняемый файл дает сбой, тогда не будет записи о том, какие строки были обработаны, а какие - нет. Если MySQL ожидает завершения вашего исполняемого файла, вставка строк может быть очень медленной. Также, если Чад Бёрч прав, тогда придется перекомпилировать MySQL, так что это звучит сложно.
Вместо того, чтобы вызывать исполняемый файл напрямую из MySQL, я бы использовал триггеры, чтобы просто записать тот факт, что строка получила INSERTED или UPDATED: записать эту информацию в базу данных, либо с новыми столбцами в существующих таблицах, либо с совершенно новой таблицей позвонил сказать database_changes
. Затем создайте внешнюю программу, которая регулярно считывает информацию из базы данных, обрабатывает ее и помечает как выполненную.
Ваше конкретное решение будет зависеть от того, какие параметры действительно нужны внешней программе.
Если вашей внешней программе нужно знать, какая строка была вставлена, то ваше решение может выглядеть следующим образом: создайте новую таблицу с именем database_changes
с полями date
, table_name
и row_id
и для всех другие таблицы, сделайте триггер, как это:
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;
Тогда ваш пакетный скрипт может сделать что-то вроде этого:
- Выберите первую строку в таблице database_changes.
- Обработка.
- Удалите его.
- Повторяйте 1-3, пока
database_changes
не станет пустым.
При таком подходе вы можете лучше контролировать, когда и как обрабатываются данные, и вы можете легко проверить, действительно ли были обработаны данные (просто проверьте, пуста ли таблица database_changes
).