Hem Ekleme hem de Güncelleme için MySQL Yangın Tetikleyicisi


111

Bir tablonun hem ekleme hem de güncelleme olayları için bir mysql tetikleyicisi tetiklemek mümkün müdür?

Aşağıdakileri yapabileceğimi biliyorum

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

Ama nasıl yapabilirim

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

Mümkün mü yoksa 2 tetikleyici kullanmam gerekiyor mu? Kod her ikisi için de aynı ve onu tekrarlamak istemiyorum.

Yanıtlar:


126

İki tetikleyici oluşturmanız gerekir, ancak ortak kodu bir prosedüre taşıyabilir ve her ikisinin de prosedürü çağırmasını sağlayabilirsiniz.


3
Söz dizimine aşina olmayanlarımız için bunun oyuncak bir örneğini verebilir misiniz?
Zxaos

3
@Zxaos: dev.mysql.com/doc/refman/5.1/en/create-procedure.html (bazı örnekler içerir) ile başlamanızı ve gerekirse kendi sorularınızı sormanızı öneririm .
derobert

2
Oracle'da olduğu gibi AND / OR operatörlerini kullanamamak üzücü, ESKİ ve YENİ tüm değişkenleri bir prosedüre parametre ile geçiremediğimizde daha da fazla.
Kodum

Bu, bir kodu iki kez yazmaktan asla ödün vermeyen bir geliştirici için kullanışlıdır ..
Sayka

1
@luismartingil, muhtemelen bir prosedürü çağırmakla onu satır içine almak için fazladan ek yük vardır. Ancak karşılığında daha kolay bakım elde edersiniz ve iki tetikleyicinin kodunun yanlışlıkla birbirinden ayrılmayacağına dair bir garanti elde edersiniz.
derobert

46

@Zxaos isteğine yanıt olarak, MySQL tetikleyicileri için AND / OR operatörlerine sahip olamadığımızdan, kodunuzdan başlayarak, aşağıda aynısını elde etmek için eksiksiz bir örnek verilmiştir.

1. INSERT tetikleyicisini tanımlayın:

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 tetikleyicisini tanımlayın

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. Bu tetikleyiciler tarafından kullanılan ortak PROSEDÜR'ü tanımlayın:

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 ;

Tetikleyicileri ve prosedürü tanımlayan işimi bitirdiğimde sınırlayıcıyı geri yüklemeye özen gösterdiğimi unutmayın.


1
IN table_row_id VARCHAR(255)Bu durumda ne var ? Demek istediğim, hangi satırın ekleneceğini veya güncelleneceğini nasıl tanımlıyorsunuz?
VaTo

13

maalesef Oracle'da olduğu gibi INSERT veya UPDATE açıklamasından sonra MySQL'de kullanamıyoruz

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.