2011-09-29 94 views
10

我看了這個article,但它似乎不適用於刪除。試圖創建觸發器,當我得到這個錯誤:如何編寫觸發器以中止MYSQL中的刪除?

Executing SQL script in server

ERROR: Error 1363: There is no NEW row in on DELETE trigger

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 script execution finished: statements: 4 succeeded, 1 failed

+0

NEW.fieldname存在;當你刪除沒有新的數據庫時!該錯誤是明顯的:你不能使用NEW.id因爲新的未在DELETE觸發 – Marco

+1

允許根據連鎖報道的選擇statatement應該失敗 - 你的SELECT語句讀起來就像一個真實的,而不是像'選擇到假'從意欲失敗的文章中。 – miherrma

回答

17

嘗試是這樣的 - 而不是通過調用你可能預示着你的自定義錯誤消息不存在的程序產生錯誤

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

簡單而正是我想要的!非常感謝 ! – JatSing

+1

MySQL已經添加了SIGNAL命令來引發錯誤。我認爲這是在這個答案後添加的。如果有人有興趣:http://dev.mysql.com/doc/refman/5.5/en/signal.html – cgTag

+0

偉大的除了@MathewFoscarini,我剛剛重新回答使用Devart的答案,你建議的SIGNAL命令的問題。 – mathielo

2

由於錯誤說:有上刪除沒有新的變量。

你只能在插入和更新使用new.id。改用old.id。

SELECT * FROM DeviceCatalog WHERE DeviceCatalog.id=old.id; 
6

那麼,錯誤消息告訴你很清楚:在DELETE觸發器中沒有新的。

  • INSERT觸發器中,你可以與新接入的新值..
  • 在一個UPDATE觸發器可以與新接入的新值,舊的有 - 你猜對了 - 老了。
  • 在DELETE觸發你可以用OLD存取權限舊值..

它僅僅是沒有意義的有新的DELETE,就像老在INSERT是沒有意義的。

12

提高@ ​​Devart的(接受)與@ MathewFoscarini的評論關於MySQL SIGNAL Command答案。

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 ; 

被選爲MySQL's Reference Manual的SQLSTATE 45000提示:

To signal a generic SQLSTATE value, use '45000', which means 「unhandled user-defined exception.」

這樣您的自定義信息將被顯示給用戶時,它會嘗試刪除記錄ID 12。另外,如果沒有記錄應該從表中刪除,您可以刪除IF .. THENEND IF;行。這將阻止ANY記錄從表中刪除。當您插入或更新的記錄