Как написать триггер для прерывания удаления в MYSQL? - PullRequest
10 голосов
/ 29 сентября 2011

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

Выполнение сценария 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 ]

17 голосов
/ 29 сентября 2011

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

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 ;
15 голосов
/ 27 апреля 2015

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

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», что означает «необработанное пользовательское исключение».

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

6 голосов
/ 29 сентября 2011

Что ж, сообщения об ошибках говорят вам довольно ясно: в триггере DELETE нет NEW.

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

Просто не имеет смысла иметь NEW в DELETE, так же, как OLD в INSERT не имеет смысла.

2 голосов
/ 29 сентября 2011

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

Вы можете использовать new.id только при вставке и обновлении.Вместо этого используйте old.id.

SELECT * FROM DeviceCatalog WHERE DeviceCatalog.id=old.id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...