2009-08-23 34 views
78

Có thể kích hoạt trình kích hoạt mysql cho cả sự kiện chèn và cập nhật của bảng không?Trình kích hoạt chống cháy của MySQL cho cả hai nút Chèn và Cập nhật

Tôi biết tôi có thể làm như sau

CREATE TRIGGER my_trigger 
    AFTER INSERT ON `table` 
    FOR EACH ROW 
BEGIN 
..... 
END // 

CREATE TRIGGER my_trigger 
    AFTER UPDATE ON `table` 
    FOR EACH ROW 
BEGIN 
..... 
END // 

Nhưng làm thế nào tôi có thể làm

CREATE TRIGGER my_trigger 
    AFTER INSERT ON `table` AND 
    AFTER UPDATE ON `table` 
    FOR EACH ROW 
BEGIN 
..... 

Có thể, hay tôi phải sử dụng 2 gây nên? Mã này giống nhau cho cả hai và tôi không muốn lặp lại nó.

Trả lời

94

Bạn phải tạo hai trình kích hoạt, nhưng bạn có thể di chuyển mã chung vào một quy trình và yêu cầu cả hai đều gọi thủ tục.

+1

đó là một ý tưởng hay. Đã không nghĩ đến việc sử dụng một thủ tục là tốt. –

+1

Bạn có thể đưa ra ví dụ về đồ chơi này cho những người không quen thuộc với cú pháp này không? – Zxaos

+2

@Zxaos: Tôi khuyên bạn nên bắt đầu bằng http://dev.mysql.com/doc/refman/5.1/en/create-procedure.html (bao gồm một số ví dụ) và hỏi (các) câu hỏi của riêng bạn nếu cần. – derobert

8

tiếc là chúng tôi không thể sử dụng trong MySQL sau INSERT hoặc UPDATE mô tả, như trong Oracle

38

Để đối phó với yêu cầu @Zxaos, vì chúng ta không thể có VÀ/HOẶC nhà khai thác cho MySQL gây nên, bắt đầu với bạn mã, dưới đây là một ví dụ hoàn chỉnh để đạt được như vậy.

1. Xác định kích hoạt INSERT:

DELIMITER // 
DROP TRIGGER IF EXISTS my_insert_trigger// 
CREATE [email protected] TRIGGER my_insert_trigger 
    AFTER INSERT ON `table` 
    FOR EACH ROW 

BEGIN 
    -- Call the common procedure ran if there is an INSERT or UPDATE on `table` 
    -- NEW.id is an example parameter passed to the procedure but is not required 
    -- if you do not need to pass anything to your procedure. 
    CALL procedure_to_run_processes_due_to_changes_on_table(NEW.id); 
END// 
DELIMITER ; 

2. Xác định kích hoạt CẬP NHẬT

DELIMITER // 
DROP TRIGGER IF EXISTS my_update_trigger// 

CREATE [email protected] TRIGGER my_update_trigger 
    AFTER UPDATE ON `table` 
    FOR EACH ROW 
BEGIN 
    -- Call the common procedure ran if there is an INSERT or UPDATE on `table` 
    CALL procedure_to_run_processes_due_to_changes_on_table(NEW.id); 
END// 
DELIMITER ; 

3. Xác định THỦ TỤC chung được sử dụng bởi cả hai gây nên:

DELIMITER // 
DROP PROCEDURE IF EXISTS procedure_to_run_processes_due_to_changes_on_table// 

CREATE [email protected] PROCEDURE procedure_to_run_processes_due_to_changes_on_table(IN table_row_id VARCHAR(255)) 
READS SQL DATA 
BEGIN 

    -- Write your MySQL code to perform when a `table` row is inserted or updated here 

END// 
DELIMITER ; 

Bạn lưu ý rằng tôi cẩn thận khôi phục dấu phân cách khi hoàn thành công việc kinh doanh xác định trình kích hoạt và thủ tục.

+1

Có gì 'trong table_row_id VARCHAR (255)' trong trường hợp này? Tôi có nghĩa là làm thế nào bạn xác định hàng nào sẽ được chèn hoặc cập nhật? – VaTo

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