2016-06-30 4 views
0

hier habe ich eine Arbeits MySQL-Trigger:Mysql Trigger-Optimierung. Mehrere Tabellenspalten IFs (OLD.data <> NEW.data)

DROP TRIGGER IF EXISTS trg_after_update_tbl1; 
DELIMITER // 
CREATE TRIGGER trg_after_update_tbl1 
    AFTER UPDATE ON db1.tbl1 FOR EACH ROW 
    BEGIN 
    DECLARE strOld VARCHAR(255); 
    DECLARE strNew VARCHAR(255); 
    SET strOld = ''; 
    SET strNew = ''; 

    IF (NEW.colA <> OLD.colA) THEN 
     SET strOld = CONCAT(strOld, 'colA: ',OLD.colA,'; '); 
     SET strNew = CONCAT(strNew, 'colA: ',NEW.colA,'; '); 
    END IF; 
    IF (NEW.colB <> OLD.colB) THEN 
     SET strOld = CONCAT(strOld, 'colB: ',OLD.colB,'; '); 
     SET strNew = CONCAT(strNew, 'colB: ',NEW.colB,'; '); 
    END IF; 
    IF (NEW.colC <> OLD.colC) THEN 
     SET strOld = CONCAT(strOld, 'colC: ',OLD.colC,'; '); 
     SET strNew = CONCAT(strNew, 'colC: ',NEW.colC,'; '); 
    END IF; 
    -- AND SO MANY COLUMN CLAUSES ON.... 

    INSERT INTO db1.changes (user, tableName, oldData, newData, date) 
    VALUES (
      user(), 
      'tableA', 
      strOld, 
      strNew, 
      now() 
     ); 
    END// 
DELIMITER ; 

Ist es möglich, Tabellenspaltennamen einer Variablen zugewiesen werden (können X sagen) aus einer Liste , Array oder etwas Ähnliches, durchlaufen Sie es und verwenden Sie nur eine IF-Klausel? Wie in dieser (Pseudo-Code):

BEGIN LOOP 
     IF (NEW.X <> OLD.X) THEN 
      SET strOld = CONCAT(strOld, X, ': ',OLD.X,'; '); 
      SET strNew = CONCAT(strNew, X, ': ',NEW.X,'; '); 
     END IF; 
END LOOP 
+0

"so viele Spalte ..." - wird 255 genug sein? –

+0

Ja, es wird tatsächlich: D –

Antwort

1

Unabhängig von den DBMS verwendet wird, was Sie vorschlagen wird normalerweise bekannt als dynamische SQL, was bedeutet, dass die Anweisung, die Sie ausführen würde zuerst kompiliert werden müssen und dann hingerichtet.

Obwohl Sie die Anzahl der Codezeilen reduzieren können, haben Sie auch negative Auswirkungen auf die Leistung.

Wie ich immer sage, Sie schreiben Code einmal, aber Sie lesen es oft und führen es noch viel öfter. Die Moral: Wenn nötig, geben Sie zusätzliche Anstrengungen, um Ihren Code lesbar und effizient zu machen.

In jedem Fall bietet MySQL Prepared Statements, die seine Version von Dynamic SQL ist.

Es gibt eine Ausnahme zu dem, was ich oben geschrieben habe: Wenn Ihre zwei Tabellen eine bekannte Anzahl von Spalten enthalten, alle vom selben Typ. In diesem Fall können Sie den Inhalt der zwei Datensätze in zwei Arrays auswählen und dann die Arrays durchlaufen (dies ist nur ein Gedanke in letzter Minute).

Verwandte Themen