#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…