Когда добавляется новая строка в базе данных, должна быть вызвана внешняя программа командной строки - PullRequest
3 голосов
/ 21 марта 2009

Возможно ли для базы данных MySQL вызывать внешний exe-файл при добавлении новой строки в одну из таблиц в базе данных?

Мне нужно следить за изменениями в базе данных, поэтому при внесении соответствующих изменений мне нужно выполнить некоторые пакетные задания вне базы данных.

Ответы [ 4 ]

14 голосов
/ 22 марта 2009

У Чада Бёрча хорошая идея использовать триггеры 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;

Тогда ваш пакетный скрипт может сделать что-то вроде этого:

  1. Выберите первую строку в таблице database_changes.
  2. Обработка.
  3. Удалите его.
  4. Повторяйте 1-3, пока database_changes не станет пустым.

При таком подходе вы можете лучше контролировать, когда и как обрабатываются данные, и вы можете легко проверить, действительно ли были обработаны данные (просто проверьте, пуста ли таблица database_changes).

4 голосов
/ 21 марта 2009
  1. вы можете делать то, что делает репликация: зависать в «двоичном журнале». настройте свой сервер как «главный сервер» и вместо добавления «подчиненного сервера» запустите mysqlbinlog. вы получите поток каждой команды, которая изменяет вашу базу данных.

    • шаг между клиентом и сервером: проверьте MySQLProxy . Вы указываете это на свой сервер, и указываете своих клиентов на прокси. он позволяет вставлять сценарии Lua для мониторинга, анализа или преобразования любой команды SQL.
0 голосов
/ 22 марта 2009

Я думаю, что на самом деле Гораздо лучшая идея иметь некоторые изменения в опросе внешних процессов в таблице и выполнять внешнюю программу - у вас также может быть столбец, в котором содержится состояние запуска этой внешней программы (например, "ожидание", "ошибка") "," success ") - и просто выберите строки, в которых этот столбец находится" в ожидании ".

Это зависит от того, как скоро нужно запустить пакетное задание. Если это что-то, что нужно запустить «рано или поздно» и может произойти сбой, и его необходимо повторить, определенно, приложение должно опрашивать таблицу и запускать их по мере необходимости.

0 голосов
/ 21 марта 2009

Я думаю, что это потребует добавления пользовательской функции, которая, я считаю, требует перекомпиляции:

MySQL FAQ - Триггеры: могут ли триггеры вызывать внешнее приложение через UDF?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...