Как написать триггер для отмены удаления в MYSQL?

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

выполнение SQL скрипта на сервере

ошибка: Ошибка 1363: нет новой строки в триггере удаления

CREATE TRIGGER DeviceCatalog_PreventDeletion 
BEFORE DELETE on DeviceCatalog
FOR EACH ROW
BEGIN
    DECLARE dummy INT;

    IF old.id = 1 or old.id =2 THEN
        SELECT * FROM DeviceCatalog WHERE DeviceCatalog.id=NEW.id;
    END IF;
END; 

выполнение сценария SQL завершено: операторы: 4 успешно, 1 не удалось

4 ответов


попробуйте что-то вроде этого -

DELIMITER $$

CREATE TRIGGER trigger1
BEFORE DELETE
ON table1
FOR EACH ROW
BEGIN
  IF OLD.id = 1 THEN -- Abort when trying to remove this record
    CALL cannot_delete_error; -- raise an error to prevent deleting from the table
  END IF;
END
$$

DELIMITER ;

улучшение ответа @ Devart (принято) с комментарием @MathewFoscarini о команда сигнала MySQL, вместо того, чтобы вызывать ошибку, вызывая несуществующую процедуру, вы можете подать сигнал о своем пользовательском сообщении об ошибке.

DELIMITER $$

CREATE TRIGGER DeviceCatalog_PreventDeletion
BEFORE DELETE ON DeviceCatalog
FOR EACH ROW
BEGIN

  IF old.id IN (1,2) THEN -- Will only abort deletion for specified IDs
    SIGNAL SQLSTATE '45000' -- "unhandled user-defined exception"
      -- Here comes your custom error message that will be returned by MySQL
      SET MESSAGE_TEXT = 'This record is sacred! You are not allowed to remove it!!';
  END IF;

END
$$

DELIMITER ;

SQLSTATE 45000 был выбран как справочное руководство MySQL предлагает:

чтобы сигнализировать общее значение SQLSTATE, используйте '45000', что означает " необработанный пользовательский исключение."

таким образом, ваше пользовательское сообщение будет отображаться пользователю всякий раз, когда он пытается удалить записи ID 1 или 2. Кроме того, если никакие записи не должны быть удалены из таблицы, вы можете просто удалить IF .. THEN и END IF; строки. Это предотвратило бы любой записи удаляются из таблицы.


Ну, сообщения об ошибках говорят вам довольно ясно: в триггере удаления нет нового.

  • в триггере вставки вы можете получить доступ к новым значениям с помощью NEW..
  • в триггере обновления вы можете получить доступ к новым значениям с помощью NEW. старые, с - как вы догадались-старыми.
  • в триггере удаления вы можете получить старые значения со старыми..

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


Как говорится в ошибке: нет новой переменной при удалении.

вы можете использовать new.id только при вставке и обновлении. Использовать старые.вместо идентификатора.

SELECT * FROM DeviceCatalog WHERE DeviceCatalog.id=old.id;