2014-06-15 11 views
6

Czy można przechodzić między nazwami wszystkich kolumn, gdy znajduje się w wyzwalaczu?przechodzenie przez kolumny w wyzwalaczu mysql

Scenariusz: Aby zarejestrować wszystkie kolumny tabeli, które zostały zmodyfikowane. Jeśli niektóre wartości się nie zmieniły, nie rejestruj tych.

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

Oto przykład kopii roboczej, w której muszę teraz przechodzić przez wszystkie kolumny dostępne w OLD lub NEW.

Odpowiedz

-1

Tak, kursor można dodać w wyzwalaczu, aby przechodzić między kolumnami. oto kilka linków:

mysql, iterate through column names

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

z doświadczenia, może łatwiej będzie utworzyć procedurę przechowywaną, która robi to zapętlenie i wkładki i wywołać ją od spustu

+1

link tylko odpowiedzi są pomarszczone w przepełnieniu stosu. W przypadku, gdyby linki stały się nieważne, lepiej byłoby zamieścić stosowne punkty w tym poście. –

+0

Nie jest również jasne, jak używać rozwiązania w tych linkach wewnątrz wyzwalacza (gdzie trzeba uzyskać dostęp do OLD i NOWEGO – adinas