SQL触发器取消删除

时间:2017-05-28 16:01:46

标签: mysql sql database

我正在尝试创建一个名为UndeleteU2Track的触发器。此触发器的目的是取消从Track表中删除与艺术家为U2的专辑相关联的任何曲目的效果。关键是触发器不会停止删除,但它通过重新创建完全相同的一行或多行已删除的轨道或轨道来取消其效果。此外,触发器忽略删除与U2无关的轨道

这是我的代码:

CREATE TRIGGER UndeleteU2Track BEFORE DELETE ON Track
BEGIN
SELECT CASE 
    WHEN OLD.TrackID IN (
        SELECT t.TrackID 
        FROM Track AS t, Album AS a 
        WHERE t.AlbumID == a.AlbumID AND a.ArtistID == 
        (SELECT ArtistID From Artist WHERE Name == "U2"))
    THEN
    INSERT INTO Track Values 
        (OLD.TrackID, OLD.Name, OLD.AlbumID, OLD.MediaTypeID, 
            OlD.GenreID, OLD.Composer, OLD.Millisecond, OLD.Byte, OLD.UnitPrice);
END;
END;

我遇到了语法错误。

1 个答案:

答案 0 :(得分:1)

而不是编写或更正你的SQL(因为它需要我在我的数据库中创建表,而我没有SQL),我会给你指点,因为我相信你的方法是错误的。

  1. 如果执行此触发器“BEFORE DELETE”并且TrackId是主键或唯一键,则此插入将失败,因为记住该记录尚未删除。所以它必须是AFTER DELETE。

  2. 可以使用删除前触发器,如果​​存在U2记录(如示例所示),可能会引发自定义异常以中止删除操作。

  3. SIGNAL SQLSTATE ='45000'
    SET MESSAGE_TEXT ='CANNOT DELETE THIS RECORD'
    
    1. 如果要删除记录,更好的策略是在删除前检查。触发器有时会被人们忽视,如果新的人正在审查数据库设计,那么这个人可能会忽视逻辑。这样的事情:
    2. E.g。

          IF NOT EXISTS
             (  SELECT t.TrackID FROM Track AS t, Album AS a  WHERE t.AlbumID = a.AlbumID AND a.ArtistID IN  
      (SELECT ArtistID From Artist WHERE `Name` = 'U2')
         ) THEN 
                  DELETE FROM TRACK WHERE TRACKID=p_TrackId;
                   END IF;