MySQL Fire Trigger สำหรับทั้ง Insert และ Update


111

เป็นไปได้ไหมที่จะเริ่มทริกเกอร์ mysql สำหรับทั้งเหตุการณ์แทรกและอัปเดตของตาราง

ฉันรู้ว่าฉันสามารถทำสิ่งต่อไปนี้ได้

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 //

แต่ฉันจะทำอย่างไร

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

เป็นไปได้หรือต้องใช้ 2 ทริกเกอร์? รหัสเหมือนกันสำหรับทั้งคู่และฉันไม่ต้องการทำซ้ำ

คำตอบ:


127

คุณต้องสร้างทริกเกอร์สองตัว แต่คุณสามารถย้ายรหัสทั่วไปลงในโพรซีเดอร์และให้ทั้งคู่เรียกโพรซีเดอร์


3
คุณช่วยยกตัวอย่างของเล่นสำหรับพวกเราที่ไม่คุ้นเคยกับไวยากรณ์ได้หรือไม่?
Zxaos

3
@Zxaos: ฉันขอแนะนำให้เริ่มต้นด้วยdev.mysql.com/doc/refman/5.1/en/create-procedure.html (ซึ่งรวมถึงตัวอย่างบางส่วน) และถามคำถามของคุณเองหากจำเป็น
derobert

2
น่าเสียดายที่เราไม่สามารถใช้ตัวดำเนินการ AND / OR เหมือนใน Oracle ได้ยิ่งไปกว่านั้นเมื่อเราไม่สามารถส่งผ่านพารามิเตอร์ไปยังโพรซีเดอร์ซึ่งเป็นตัวแปรทั้งหมดทั้งเก่าและใหม่ รหัสของฉันจะเป็น> 2x
Mikel

อันนี้มีประโยชน์สำหรับนักพัฒนาที่ไม่เคยประนีประนอมกับการเขียนโค้ดซ้ำสอง ..
Sayka

1
@luismartingil อาจมีค่าใช้จ่ายเพิ่มเติมในการเรียกขั้นตอนเทียบกับการซับใน แต่ในทางกลับกันคุณจะได้รับการบำรุงรักษาที่ง่ายขึ้นและรับประกันว่ารหัสของทริกเกอร์ทั้งสองจะไม่แตกต่างกันโดยไม่ได้ตั้งใจ
derobert

46

เพื่อตอบสนองต่อคำขอ @Zxaos เนื่องจากเราไม่มีตัวดำเนินการ AND / OR สำหรับทริกเกอร์ MySQL โดยเริ่มจากโค้ดของคุณด้านล่างนี้เป็นตัวอย่างที่สมบูรณ์เพื่อให้บรรลุสิ่งเดียวกัน

1. กำหนดทริกเกอร์ INSERT:

DELIMITER //
DROP TRIGGER IF EXISTS my_insert_trigger//
CREATE DEFINER=root@localhost 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. กำหนดทริกเกอร์ UPDATE

DELIMITER //
DROP TRIGGER IF EXISTS my_update_trigger//

CREATE DEFINER=root@localhost 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. กำหนดขั้นตอนทั่วไปที่ใช้โดยทริกเกอร์ทั้งสองนี้:

DELIMITER //
DROP PROCEDURE IF EXISTS procedure_to_run_processes_due_to_changes_on_table//

CREATE DEFINER=root@localhost 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 ;

คุณทราบว่าฉันดูแลที่จะกู้คืนตัวคั่นเมื่อฉันทำธุรกิจของฉันเพื่อกำหนดทริกเกอร์และขั้นตอน


1
มีอะไรIN table_row_id VARCHAR(255)ในกรณีนี้หรือไม่? ฉันหมายถึงว่าคุณกำลังกำหนดว่าจะแทรกหรืออัปเดตแถวใด
VaTo

13

น่าเสียดายที่เราไม่สามารถใช้ใน MySQL หลังจาก INSERT หรือ UPDATE description เช่นใน Oracle

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.