2009-08-23 10 views
78

Ist es möglich, einen mysql-Trigger für die Einfüge- und Update-Ereignisse einer Tabelle auslösen?MySQL Fire Trigger für beide Einfügen und Update

Ich weiß, ich kann die folgende

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

tun, aber wie kann ich tun

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

Ist es möglich, oder muss ich 2 Trigger verwenden? Der Code ist für beide gleich und ich möchte ihn nicht wiederholen.

Antwort

94

Sie müssen zwei Trigger erstellen, aber Sie können den allgemeinen Code in eine Prozedur verschieben und beide müssen die Prozedur aufrufen.

+1

das ist eine gute Idee. Hatte nicht gedacht, auch eine Prozedur zu verwenden. –

+1

Können Sie uns ein Beispiel für diejenigen geben, die mit der Syntax nicht vertraut sind? – Zxaos

+2

@Zxaos: Ich würde vorschlagen, mit http://dev.mysql.com/doc/refman/5.1/en/create-procedure.html (die einige Beispiele enthält) zu beginnen und bei Bedarf eigene Fragen zu stellen. – derobert

8

können wir leider nicht in MySQL nach INSERT oder Beschreibung AKTUALISIEREN, wie in Oracle

38

Als Reaktion auf @Zxaos Anfrage, da wir nicht AND/OR-Operatoren für MySQL-Trigger haben können, beginnend mit Code, unten ist ein vollständiges Beispiel, um das gleiche zu erreichen.

1. INSERT Trigger definieren:

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. die UPDATE-Trigger definieren

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 ; 

von beiden dieser Trigger 3. Das einheitliche Verfahren verwendet definieren:

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 ; 

Sie beachten, dass ich darauf achten, das Trennzeichen wiederherzustellen, wenn ich mit meinem Geschäft fertig bin, das die Auslöser und die Prozedur definiert.

+1

Was ist 'IN table_row_id VARCHAR (255)' in diesem Fall? Ich meine, wie definierst du, welche Zeile eingefügt oder aktualisiert wird? – VaTo