2011-09-29 27 views
10

Tôi đọc số này article nhưng có vẻ như không hoạt động để xóa. Tôi đã nhận lỗi này khi cố gắng để tạo ra một kích hoạt:Làm thế nào để viết trình kích hoạt để hủy bỏ xóa trong 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 tồn tại khi bạn chèn hoặc cập nhật bản ghi; khi bạn xóa không có gì mới đang đến cơ sở dữ liệu !!! Lỗi rõ ràng: bạn không thể sử dụng NEW.id vì NEW không được phép trong trình kích hoạt DELETE – Marco

+1

Theo bài viết được liên kết, statatement được chọn sẽ không thành công - câu lệnh chọn của bạn đọc giống như thực tế và không giống như 'select into dummy 'từ bài viết có ý định thất bại. – miherrma

Trả lời

17

Hãy thử một cái gì đó như thế này -

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

Đơn giản và chính xác những gì tôi muốn! Cảm ơn nhiều ! – JatSing

+1

MySQL đã thêm lệnh SIGNAL để tăng lỗi. Tôi nghĩ rằng nó đã được thêm vào sau câu trả lời này. Nếu có ai quan tâm: http://dev.mysql.com/doc/refman/5.5/en/signal.html – cgTag

+0

Ngoài ra tuyệt vời @MathewFoscarini, tôi vừa trả lời câu hỏi bằng câu trả lời của Devart và lệnh SIGNAL mà bạn đã đề xuất . – mathielo

2

Khi lỗi nói: Không có biến MỚI về xóa.

bạn có thể sử dụng new.id chỉ khi chèn và cập nhật. Sử dụng old.id để thay thế.

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

Vâng, thông báo lỗi cho bạn biết rõ ràng: trong trình kích hoạt DELETE không có MỚI.

  • Trong một trigger INSERT bạn có thể truy cập vào các giá trị mới với MỚI ..
  • Trong một cò CẬP NHẬT bạn có thể truy cập vào các giá trị mới với MỚI, những cái cũ với -. Bạn đoán nó - OLD.
  • Trong một trigger DELETE bạn có thể acces các giá trị cũ với OLD ..

Nó chỉ đơn giản làm cho không có ý nghĩa để có MỚI trong một DELETE, cũng giống như OLD trong một INSERT làm cho không có ý nghĩa.

12

Cải thiện @ Devart của câu trả lời (chấp nhận) với @ bình luận MathewFoscarini về MySQL SIGNAL Command, thay vì nâng cao một lỗi bằng cách gọi một thủ tục không tồn bạn có thể là dấu hiệu thông báo lỗi tùy chỉnh của bạn.

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 ; 

Các 45000 SQLSTATE được chọn làm MySQL's Reference Manual gợi ý:

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

Bằng cách này thông báo tùy chỉnh của bạn sẽ được hiển thị cho người sử dụng bất cứ khi nào nó sẽ cố gắng để xóa các bản ghi ID 1 hoặc 2. Ngoài ra, nếu không có hồ sơ nào bị xóa khỏi bảng, bạn chỉ có thể xóa các dòng IF .. THENEND IF;. Điều này sẽ ngăn không cho ANY các bản ghi bị xóa trên bàn.

Các vấn đề liên quan