Запуск определенной процедуры в случае сбоя - PullRequest
1 голос
/ 26 февраля 2011

Я хочу вызвать процедуру в определенное время, поэтому я создаю событие, которое сделает это (вызов процедуры) для меня. Код выглядит так: </p> <pre> CALL MainProcedure(@firstOutParam, @secondOutParam); SELECT @moveId, @endTime; #select just for check if parameters are ok CREATE EVENT myevent1 ON SCHEDULE AT @endTime DO CALL `database`.`SupportingProcedure`(@firstOutParam); CREATE EVENT myevent2 ON SCHEDULE AT @endTime DO CALL `database`.`OnlyForTestProcedure`(); </pre> <p>

И SupportingProcedure, и OnlyForTestProcedure при вызове не из события работают должным образом, также вызовы myevent2. OnlyForTestProcedure.

Единственное, что не работает, это myevent1. Он появляется на show events, затем исчезает, но не работает (SupportingProcedure либо не вызывается, либо не работает ..).

Вы видите что-нибудь, что я делаю неправильно? Что я должен сделать, чтобы это работало? Любая помощь приветствуется, я понятия не имею, что еще нужно проверить.

Ответы [ 2 ]

1 голос
/ 27 февраля 2011

Вы включили планировщик событий?

Вам нужна запись в my.cnf в разделе [mysqld], говорящая:

event_scheduler=on

Если событие как-то не удается, mysql имеет плохоеподдержка диагностики, но вы увидите некоторые записи журнала в файле журнала mysql (который обычно находится в каталоге данных mysql, например / var / lib / mysql или в системных журналах / var / log)

В документации говорится, что нет способа передать аргумент в и из процедуры, вызванной событием, поэтому ваше первое событие, переданное в @firstOutParam, вероятно, не будет работать.Чтобы обойти это, вам нужно будет динамически построить SQL в виде текста и выполнить его.

SET @sql = CONCAT("CREATE EVENT myevent1 ON SCHEDULE AT ", @endTime, " DO CALL 
`database`.`SupportingProcedure`(",@firstOutParam,")");
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
0 голосов
/ 06 марта 2011

Как я упоминал ранее CREATE EVENT внутри процедуры невозможно, возможно, она закрывает тему, но читайте дальше.

1) Если вы используете MySQL с PHP и вам требуется одно событие в базе данных, вы можете мгновенно запуститьодин через метод запроса mysqli.

2) Если вам нужно отслеживать определенные изменения в таблицах, вы можете создать событие, которое является своего рода демоном.Просто установите его на:

CREATE EVENT EventDaemon ON SCHEDULE EVERY 1 SECOND STARTS NOW() DO CALL procedure();

, где procedure выполняет свое тело, только если выполняются определенные требования (что может привести к СОЗДАНИЮ СОБЫТИЯ в исходной ситуации).Не могу точно сказать, эффективен ли он, но у меня он работает нормально.

Надеюсь, я дал понять.

...