Можно ли сделать ROLLBACK в триггере MySQL? - PullRequest
2 голосов
/ 09 июля 2011

Вот только в чем вопрос: возможно ли выполнить откат в триггере MySQL?

Если ответ положительный, объясните, пожалуйста, как.

Ответы [ 3 ]

9 голосов
/ 20 июля 2012

Я обнаружил, что эта функциональность существует начиная с MySQL 5.5 и не работает в более ранних выпусках.

Триггер не выполняет откат или фиксацию.Чтобы инициировать любой откат, вы должны вызвать исключение.Таким образом, ваша команда вставки / обновления / удаления будет прервана.Действие отката или фиксации должно быть вызвано вашей командой SQL.

Чтобы вызвать ваше исключение, в триггере XXX (например,):

create trigger Trigger_XXX_BeforeInsert before insert on XXX
for each row begin

    if [Test]
    then

      SIGNAL sqlstate '45001' set message_text = "No way ! You cannot do this !";

    end if ;

end ;
5 голосов
/ 09 июля 2011

From: http://dev.mysql.com/doc/refman/5.1/en/trigger-syntax.html

Триггер не может использовать операторы, которые явно или неявно начинают или заканчивают транзакцию, например START TRANSACTION, COMMIT или ROLLBACK.

и

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

5 голосов
/ 09 июля 2011

Если триггер вызывает исключение, это прервет транзакцию, фактически откатившись. Будет ли это работать для вас?

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