如何编写触发器来中止MYSQL中的删除?

Jat*_*ing 12 mysql triggers sql-delete

我读过这篇文章,但它似乎不适用于删除.尝试创建触发器时出现此错误:

在服务器中执行SQL脚本

错误:错误1363:DELETE触发器中没有新行

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; 
Run Code Online (Sandbox Code Playgroud)

SQL脚本执行完成:语句:4成功,1失败

Dev*_*art 18

尝试这样的事情 -

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 ;
Run Code Online (Sandbox Code Playgroud)


mat*_*elo 16

使用@MathewFoscarini关于MySQL SIGNAL Command的评论来改进@ Devart的(已接受)答案,而不是通过调用不存在的过程引发错误,您可以发出自定义错误消息的信号.

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 ;
Run Code Online (Sandbox Code Playgroud)

选择SQLSTATE 45000作为MySQL的参考手册建议:

要发信号通用SQLSTATE值,请使用"45000",表示"未处理的用户定义的异常".

这样,您的自定义信息将被显示时,它会尝试删除记录ID的用户12.此外,如果不应从表中删除任何记录,则可以删除IF .. THENEND IF;行.这样可以防止在表上删除任何记录.


won*_*nk0 6

好吧,错误消息非常清楚地告诉你:在DELETE触发器中没有新的.

  • 在INSERT触发器中,您可以使用NEW访问新值.
  • 在UPDATE触发器中,您可以使用NEW来访问新值,旧的 - 您猜对了 - OLD.
  • 在DELETE触发器中,您可以使用OLD访问旧值.

在DELETE中使用NEW是没有意义的,就像INSERT中的OLD没有意义一样.