2014-06-15 2 views
6

트리거 내부에서 모든 열 이름을 반복 할 수 있습니까?mysql 트리거의 열을 통한 루프

시나리오 : 수정 된 테이블의 모든 열을 기록합니다. 일부 값이 변경되지 않은 경우 값을 변경하지 마십시오.

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

이것은 작업 복사본 예입니다. 이제 OLD 또는 NEW에서 사용 가능한 모든 열을 반복해야합니다.

답변

-1

예, 커서를 사용하여 열을 반복 할 수 있습니다.

mysql, iterate through column names

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

경험에서, 루프와 삽입을 수행하는 저장 프로 시저를 쉽게 만들 수 있습니다 트리거

+1

링크에서 호출 : 여기 링크의 커플 스택 오버플로에 대해서만 대답을 볼 수 있습니다. 링크가 유효하지 않을 경우를 대비하여이 게시물에 해당 포인트를 포함하는 것이 좋습니다. –

+0

트리거 내부의 링크에서 솔루션을 사용하는 방법이 명확하지 않습니다 (OLD 및 NEW에 액세스해야하는 경우). – adinas