2009-08-23 6 views
78

È possibile attivare un trigger mysql per entrambi gli eventi di inserimento e aggiornamento di una tabella?MySQL Fire Trigger per Insert e Update

so di poter fare quanto segue

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

Ma come posso fare

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

E 'possibile, o devo usare 2 trigger? Il codice è lo stesso per entrambi e non voglio ripeterlo.

risposta

94

È necessario creare due trigger, ma è possibile spostare il codice comune in una procedura e chiedere a entrambi di chiamare la procedura.

+1

questa è una buona idea. Non avevo pensato di usare anche una procedura. –

+1

Potresti dare un esempio di questo per quelli di noi che non hanno familiarità con la sintassi? – Zxaos

+2

@Zxaos: Suggerirei di iniziare con http://dev.mysql.com/doc/refman/5.1/en/create-procedure.html (che include alcuni esempi) e di porre le tue domande se necessario. – derobert

8

purtroppo non siamo in grado di utilizzare in MySQL dopo inserire o aggiornare descrizione, come in Oracle

38

In risposta alla richiesta @Zxaos, dal momento che non possiamo avere e/o operatori per MySQL trigger, partire con la vostra codice, di seguito è un esempio completo per ottenere lo stesso.

1. Definire il trigger 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. Definire il trigger UPDATE

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. definire la procedura comune utilizzato da entrambi questi fattori scatenanti:

Si noti che mi occupo di ripristinare il delimitatore quando ho terminato la mia attività definendo i trigger e la procedura.

+1

Cosa c'è 'IN table_row_id VARCHAR (255)' in questo caso? Voglio dire come stai definendo quale riga verrà inserita o aggiornata? – VaTo