2017-05-28 106 views
-1

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

这里没有关联的缺失是我的代码:

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记录(如您的示例中),可能会引发自定义异常以中止删除操作。

SIGNAL SQLSTATE ='45000' 
SET MESSAGE_TEXT ='CANNOT DELETE THIS RECORD' 
  • 更好的策略是检查之前删除该记录是否应被删除。触发器有时会被人忽略,如果有人正在审查数据库设计,那么这个人可能会忽略逻辑。例如:
  • 例如,

    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; 
    
    +0

    PS:代码格式不适用于我今天在stackoverflow上。 –

    +0

    代码格式化在列表后不起作用。我知道修复它的最简单方法是添加另一段(正如我所做的那样)。 –

    +0

    @CraigYoung谢谢 –