Почему не отрабатывает mysql trigger?

Рейтинг: 0Ответов: 1Опубликовано: 30.04.2015

Отрабатывает только последний case, а первые 2 нет. Уже всею голову сломал. Помогите пожалуйста.

DROP TRIGGER IF EXISTS queue_log;
DELIMITER $$

CREATE TRIGGER `queue_log` AFTER insert ON `queue_log`

FOR EACH ROW BEGIN

CASE WHEN queue_log.`event` = 'COMPLETEAGENT' THEN UPDATE calls SET calls.laststep = 'answered' WHERE calls.uniqueid = NEW.callid;
END CASE;

CASE WHEN queue_log.`event` = 'COMPLETECALLER' THEN UPDATE calls SET calls.laststep = 'answered' WHERE calls.uniqueid = NEW.callid;
END CASE;

CASE WHEN queue_log.`event` = 'RINGNOANSWER' THEN DELETE FROM queue_log WHERE queue_log.callid = NEW.callid;
END CASE;

END$$

DELIMITER ;

Ответы

▲ 1

Прежде всего нужно отметить, что триггер вообще написан неправильно. Конструкция CASE/WHEN используется иначе. Скорее всего имелось в виду следующее:

DROP TRIGGER IF EXISTS queue_log;
DELIMITER $$

CREATE TRIGGER `queue_log` AFTER insert ON `queue_log`
FOR EACH ROW BEGIN
  CASE NEW.`event` # не `queue_log`, а именно NEW
    WHEN 'COMPLETEAGENT' THEN UPDATE calls SET calls.laststep = 'answered' WHERE calls.uniqueid = NEW.callid;
    WHEN 'COMPLETECALLER' THEN UPDATE calls SET calls.laststep = 'answered' WHERE calls.uniqueid = NEW.callid;
    WHEN 'RINGNOANSWER' THEN DELETE FROM queue_log WHERE queue_log.callid = NEW.callid;
  END CASE;
END$$

DELIMITER ;

Но даже c правильным CASE/WHEN триггер работать не будет, поскольку в третьей ветке происходит удаление из той же таблицы, операция над которой запускает триггер.

Самое удивительное в том, что в вопросе заявлено, что как раз третья ветка отрабатывает, несмотря на обе проблемы.