2017-02-17 1 views
0

Ich habe einen Trigger geschrieben, der jede Datenaktualisierung protokolliert und previous_value, new_value, field_name und viele mehr protokolliert. Aber das Problem ist, ich habe 77 Felder in meiner Tabelle. So, es ist schwierig, IF ENDIF für jedes Feld zu schreiben, also möchte ich wissen, ist es möglich, mit Schleife zu schreiben?Willst du einen Trigger nach UPDATE schreiben

Bereits in dba.stackexchange.com gefragt, aber bekam keine Antwort noch fruchtbare, Link unten ::

Link

Ich habe bisher versucht ::

BEGIN 

IF(OLD.company_name != NEW.company_name) THEN 
INSERT INTO elm_activity_log (user_id, action_on, action, action_col, action_old_value, action_new_value, action_at, action_on_id) VALUES (NEW.updated_by, "company", "update", "company_name", OLD.company_name, NEW.company_name, CURRENT_TIMESTAMP(), NEW.company_id); 
END IF; 
IF(OLD.company_first_name != NEW.company_first_name) THEN 
INSERT INTO elm_activity_log (user_id, action_on, action, action_col, action_old_value, action_new_value, action_at, action_on_id) VALUES (NEW.updated_by, "company", "update", "company_first_name", OLD.company_first_name, NEW.company_first_name, CURRENT_TIMESTAMP(), NEW.company_id); 
END IF; 

END 

Bitte helfen oder jeder Vorschlag wird sehr hilfreich sein.

Vielen Dank im Voraus.

+1

nicht innerhalb mysql landen sollte. Ich würde den Inhalt von information_schema.columns in Excel ablegen und den Code dort erstellen. –

Antwort

1

Sie können dies nicht automatisch tun, aber ich verstehe Ihren Standpunkt. Solange Sie schlau genug sind, ist Faulheit tatsächlich eine Qualität in den Computerwissenschaften.

Normalerweise überwinde ich diese Art von Problemen mit "automatische Programmierung": machen Sie Code, der Code generiert.

Sie haben 2 Möglichkeiten Ihre SQL-Anweisungen zu generieren:

1. Pure SQL 
2. Programming language 

Hier ist ein Anfang Lösung SQL verwenden:

SELECT 
    CONCAT 
    (
     'IF(OLD.company_name != NEW.company_name) THEN \n 
     INSERT INTO elm_activity_log (user_id, action_on, action, action_col, action_old_value, action_new_value, action_at, action_on_id) VALUES (NEW.updated_by, "company", "update", "', T.column_name,'", OLD.', T.column_name, ', NEW.', T.column_name,', CURRENT_TIMESTAMP(), NEW.company_id); \n 
     END IF; \n 
     \n 
     ' 
    ) as SQLstatement 

FROM 
(
    SELECT column_name 
    FROM information_schema.columns 
    WHERE column_name NOT IN ('id') 
     AND table_name = 'your_table' 
     AND table_schema = 'database_name' 
) T 

Es könnte gerade arbeiten, könnte es muss ein litlle Bit neu geschrieben werden . Sie haben Ihre Tabellen-DLL nicht zur Verfügung gestellt, so dass ich kaum testen kann, ob sie funktioniert.

Die Idee besteht darin, für jeden Spaltennamen eine Zeile zu generieren, die die SQL-Anweisung für den Auslöseteil dieser Spalte enthält. Sie können dann die Ergebnisse dieser Abfrage in eine Textdatei exportieren, et voila.

Passen Sie entsprechend in der verschachtelten Abfrage an: Tabellenname, Tabellenschema und Spalten, die Sie von der Protokollierung ausschließen möchten (ich habe "ID" festgelegt).

Beachten Sie, dass in der SELECT CONCAT, ich einige /n hinzugefügt, die in Zeilenumbrüche in der Ausgabe