Как написать триггер для отмены удаления в 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;