programing

MySQL 트리거를 사용하여 모든 테이블 변경 내용을 보조 테이블에 기록

oldcodes 2023. 9. 26. 22:31
반응형

MySQL 트리거를 사용하여 모든 테이블 변경 내용을 보조 테이블에 기록

테이블이 있습니다.

CREATE TABLE `data_table` (
`data_id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`field1` INT NOT NULL ,
`field2` INT NOT NULL ,
`field3` INT NOT NULL
) ENGINE = MYISAM ;

필드 1, 2, 3에 기록할 기회를 기록합니다.

CREATE TABLE `data_tracking` (
`tracking_id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`data_id` INT NOT NULL ,
`field` VARCHAR( 50 ) NOT NULL ,
`old_value` INT NOT NULL ,
`new_value` INT NOT NULL ,
`modified` DATETIME NOT NULL
) ENGINE = MYISAM ; 

MySQL 5를 사용하고 있는데, 트리거를 생성하고 싶습니다.data_table이 업데이트 될 때마다 data_tracking에 새로운 행을 삽입하고 이전/업데이트된 값과 변경된 필드를 기록하고자 합니다.저는 다음과 같이 시도해 보았지만 성공하지 못했습니다.

DELIMITER $$

DROP TRIGGER `update_data `$$

CREATE TRIGGER `update_data` AFTER UPDATE on `data_table`
FOR EACH ROW
BEGIN
    IF (NEW.field1 != OLD.field1) THEN
        INSERT INTO data_tracking set old_value = OLD.field1, new_value = NEW.field1, field = "field1";
    END IF;
END$$

DELIMITER ;

삽입 라인에 오류가 발생했습니다. 구문이 무엇이어야 하는지 또는 올바른 방법으로 진행하는 것인지 잘 모르겠습니다.어떤 도움이라도 주시면 감사하겠습니다.감사해요.

삽입 구문은

INSERT INTO table (columns_list) VALUES (values_list)

따라서 삽입은 다음과 같습니다(MySQL 전문가는 아니지만 쿼리에 맞출 수 있습니다).

INSERT INTO data_tracking 
(`data_id` , `field` , `old_value` , `new_value` , `modified` ) 
VALUES 
(NEW.data_id, 'field1', OLD.field, NEW.field, CURRENT_DATETIME());

그리고 필드2 및 필드3에 대한 변동에 대해 반복합니다.

이것이 완전한 트리거가 될 것으로 생각합니다. 시도해 보십시오.

DELIMITER $$

DROP TRIGGER `update_data `$$

CREATE TRIGGER `update_data` AFTER UPDATE on `data_table`
FOR EACH ROW
BEGIN
    IF (NEW.field1 != OLD.field1) THEN
        INSERT INTO data_tracking 
            (`data_id` , `field` , `old_value` , `new_value` , `modified` ) 
        VALUES 
            (NEW.data_id, "field1", OLD.field1, NEW.field1, NOW());
    END IF;
    IF (NEW.field2 != OLD.field2) THEN
        INSERT INTO data_tracking 
            (`data_id` , `field` , `old_value` , `new_value` , `modified` ) 
        VALUES 
            (NEW.data_id, "field2", OLD.field2, NEW.field2, NOW());
    END IF;
    IF (NEW.field3 != OLD.field3) THEN
        INSERT INTO data_tracking 
            (`data_id` , `field` , `old_value` , `new_value` , `modified` ) 
        VALUES 
            (NEW.data_id, "field3", OLD.field3, NEW.field3, NOW());
    END IF;
END$$

DELIMITER ;

언급URL : https://stackoverflow.com/questions/779230/using-mysql-triggers-to-log-all-table-changes-to-a-secondary-table

반응형