2017-05-28 132 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謝謝 –