2014-06-15 7 views
6

Ist es möglich, alle innerhalb eines Triggers alle Spaltennamen durchlaufen?Schleife durch Spalten in Mysql-Trigger

Szenario: Um alle Spalten einer Tabelle zu protokollieren, die geändert wurden. Wenn sich einige Werte nicht geändert haben, protokollieren Sie diese nicht.

DROP TRIGGER IF EXISTS t_before_update_test; 
DELIMITER $$ 
CREATE TRIGGER t_before_update_test 
BEFORE UPDATE ON test 
FOR EACH ROW 
BEGIN 
    -- Loop here for all columns, not just col1 
    IF OLD.col1 <> NEW.col1 THEN 
     INSERT INTO change_logs(
      log_on, user_id, 
      table_name, colum_name, 
      old_data, new_data 
     ) VALUES (
      UNIX_TIMESTAMP(NOW()), '0', 
      'test', 'col1', 
      OLD.col1, NEW.col1 
     ); 
    END IF; 
    -- process looping all columns 
    -- col1, col2, ... should be dynamic per loop 
END $$ 

Dies ist Arbeitskopie Beispiel, wo ich jetzt alle Spalten in OLD oder NEW durchlaufen müssen.

Antwort

-1

Ja, ein Cursor kann innerhalb eines Triggers hinzugefügt werden, um Spalten zu durchlaufen. hier sind ein paar Links:

mysql, iterate through column names

https://dba.stackexchange.com/questions/22925/mysql-loop-over-cursor-results-ends-ahead-of-schedule

aus Erfahrung, könnte es einfacher sein, eine gespeicherte Prozedur zu erstellen, die die Looping und Einsätze tun und es aus dem

+1

Link-Lockruf Nur die Antworten sind bei Stack Overflow verpönt. Es wäre besser, die relevanten Punkte in diesen Beitrag aufzunehmen, falls die Links ungültig werden. –

+0

Es ist auch nicht klar, wie die Lösung in diesen Links innerhalb eines Triggers (wo Sie auf OLD und NEW zugreifen müssen) verwendet wird – adinas