MySQL Fire Trigger untuk Sisipkan dan Pembaruan

111

Apakah mungkin untuk mengaktifkan pemicu mysql untuk peristiwa penyisipan dan pembaruan tabel?

Saya tahu saya bisa melakukan hal berikut

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

Tapi bagaimana saya bisa melakukannya

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

Apakah mungkin, atau apakah saya harus menggunakan 2 pemicu? Kode untuk keduanya sama dan saya tidak ingin mengulanginya.

Adam S-Price
sumber

Jawaban:

126

Anda harus membuat dua pemicu, tetapi Anda dapat memindahkan kode umum ke dalam prosedur dan meminta keduanya memanggil prosedur.

derobert
sumber
3
Bisakah Anda memberi contoh mainan ini untuk kita yang tidak terbiasa dengan sintaks?
Zxaos
3
@ Zxaos: Saya sarankan memulai dengan dev.mysql.com/doc/refman/5.1/en/create-procedure.html (yang menyertakan beberapa contoh) dan mengajukan pertanyaan Anda sendiri jika diperlukan.
derobert
2
Sangat disayangkan bahwa kami tidak dapat menggunakan operator AND / OR seperti di Oracle, terlebih lagi ketika kami juga tidak dapat mengirimkan parameter ke prosedur seluruh variabel OLD dan NEW. Kode saya akan> 2x
Mikel
Yang ini berguna untuk pengembang yang tidak pernah kompromi dalam menulis kode dua kali ..
Sayka
1
@luismartingil mungkin ada beberapa overhead tambahan untuk memanggil prosedur vs. menyebariskannya. Tetapi sebagai gantinya Anda mendapatkan perawatan yang lebih mudah dan jaminan bahwa kode kedua pemicu tidak akan menyimpang secara tidak sengaja.
derobert
46

Menanggapi permintaan @Zxaos, karena kami tidak dapat memiliki operator AND / OR untuk pemicu MySQL, dimulai dengan kode Anda, di bawah ini adalah contoh lengkap untuk mencapai hal yang sama.

1. Tentukan pemicu 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. Tentukan pemicu 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. Tentukan PROSEDUR umum yang digunakan oleh kedua pemicu berikut:

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 ;

Anda perhatikan bahwa saya berhati-hati untuk memulihkan pembatas ketika saya selesai dengan bisnis saya yang menentukan pemicu dan prosedur.

Al Zziwa
sumber
1
Ada apa IN table_row_id VARCHAR(255)dalam kasus ini? Maksud saya, bagaimana Anda menentukan baris mana yang akan disisipkan atau diperbarui?
VaTo
13

sayangnya kami tidak dapat menggunakan di MySQL setelah INSERT atau UPDATE deskripsi, seperti di Oracle

Jeff_Alieffson
sumber