Отменить УДАЛЕНИЕ с помощью триггеров

#mysql #triggers #abort

#mysql #триггеры #прервать

Вопрос:

Я хочу отменить ТРИГГЕР УДАЛЕНИЯ. Идея в том, чтобы ПЕРЕД удалением установить столбец hide = "Y" , затем ОТМЕНИТЬ событие ЗАПУСКА, а на самом деле НЕ УДАЛЯТЬ строку.

Это возможно?

Комментарии:

1. Если бы MySQL поддерживал INSTEAD OF триггеры, это определенно было бы возможно. Но если что-то не изменилось, я не верю, что он поддерживает это в настоящее время.

2. Звучит как нечто, что должно обрабатываться бизнес-логикой, а не магией базы данных.

3. Да… Обычно я делаю это на PHP (I’ll), но я прочитал о INSTEAD OF thing, но я не нашел его для MYSQL. : ( Кажется, есть обходной путь только для этого.

Ответ №1:

Вы можете отменить удаление, однако вы не можете изменить значения в DELETE триггере.

 DELIMITER $$

CREATE TRIGGER bd_t1_each BEFORE DELETE ON t1 FOR EACH ROW
BEGIN
  //This will not work, because the `NEW` virtual table does not exist in a delete trigger.
  SET NEW.hide = 'Y';
  //Raising an error will work.
  SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'DELETE canceled'; 
END $$

DELIMITER ;
  

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

 DELIMITER $$

CREATE PROCEDURE delete_t1_row (pID INTEGER)
BEGIN
  UPDATE t1 SET hide = 'Y' WHERE id = pID;
END $$

DELIMITER ;
  

Комментарии:

1. Спасибо! Это не решает проблему, но объясните, что в настоящее время это невозможно. Возможно, ограничение MySQL…