2 марта 2010 г. MySQL Триггеры

MySQL. Остановка выполнения sql-запроса через триггер

Как приостановить выполнения SQL после триггера? То есть, при определенных условиях, описанных в триггере надо остановить выполнения SQL который и вызвал этот триггер.
Я размышлял и гуглил на эту тему, но единственное что у меня получилось, это выполнять ошибочный SQL-код, тем самым останавливать выполнение SQL кода, который выполнится после триггера.

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

Ну это все слова, а теперь покажу реализацию:

delimiter //
DROP TRIGGER IF EXISTS `customers_update_status`//
CREATE TRIGGER `customers_update_status` BEFORE UPDATE ON `customers` FOR EACH ROW BEGIN
    IF new.`status` < old.`status` THEN
        BEGIN
            INSERT INTO `customers` SET old.`status` = "STOP_SQL_QUERY";
        END;
    END IF;
END//
delimiter ;

Поле status имеет тип ENUM и у него нет значения STOP_SQL_QUERY, поэтому происходит ошибка и SQL-запрос идущий за триггером не выполняется. Это не корректное, но единственное найденное мной решение. Вообще, наверное еще лучше чтобы был не INSERT, а UPDATE. Тогда будет ошибка более корректна с виду.

зы. Кстати на официальной страничке CREATE TRIGGER в камментах приводится именно такой способ по остановке выполнения sql-запроса.

Комментарии

Ты все же остановился на таком варианте, о других я не думал. Хорошо, что написал, будем знать.

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

Какого админа? Если надо оповещения, то перед срабатыванием ложного sql-запроса надо выполнить запись в таблицу лога, например.

Это один из вариантов. Пример. У меня на проекте много всяких event, procedure and triggers и бывает такое, что я изменю таблицу (удалю поле), а в этих "структурах" забуду поменять - эксепшен, хотелось бы видеть предупреждение, может есть какие-то плагины для Мускуля, которые шлют там почту... Для МсСКЛ такая фича есть )

Думаю еще можно извратится через "INTO OUTFILE"... По крайней мере я плагины не встречал. В PostgreSQL есть поддержка Perl насколько я помню, там думаю проще подобное организовать...

Ты гуглил и ничего не нашел? А как же тогда официальная страничка CREATE_TRIGGER?

vasa_c, автор этого блога гуглил везде, и у меня на блоге был, просто вопрос специфический и лекарство официального нет.

vasa_c, я не нашел "другого решения". А что с официальной страничкой не так?

В версии 5.5 появился SIGNAL, который генерирует ошибку и останавливает транзу, поэтому можно более корректно использовать это. Еще есть RESIGNAL для смены номера и текста ошибки на свою.

Оставьте свой комментарий

Markdown