개발
마리아디비, MySQL 트리거를 통한 테이블 히스토리 쌓기
JK.
2022. 1. 10. 11:34
728x90
CREATE DEFINER=`root`@`127.0.0.1` TRIGGER `table_after_update` AFTER UPDATE ON `table` FOR EACH ROW BEGIN
INSERT INTO table_history
(
table_idx,
table_name,
table1,
table2,
table3,
table4,
table5,
table6,
insert_dt
)
VALUES
(
CONCAT(OLD.table_idx, " -> ", NEW.table_idx),
CONCAT(OLD.table_name, " -> ", NEW.table_name),
CONCAT(OLD.table1, " -> ", NEW.table1),
CONCAT(OLD.table2, " -> ", NEW.table2),
CONCAT(OLD.table3, " -> ", NEW.table3),
CONCAT(OLD.table4, " -> ", NEW.table4),
CONCAT(OLD.table5, " -> ", NEW.table5),
CONCAT(OLD.table6, " -> ", NEW.table6),
CURRENT_TIMESTAMP()
);
END
구조
- table( 히스토리가 필요한 테이블 ), table_history( 히스토리 쌓을 테이블 )
위와 같이 하면 table_history테이블에 업데이트 할때마다 쌓이게 된다.
현재 방법은 특정컬럼 위주가 아니기 때문에
다른 table에서 우리가 원하는 데이터가 아닌 컬럼을 수정 할 경우 계속해서 쌓이게 된다.
이 부분을 해결하기 위해서는
if문을 통해서 OLD, NEW를 비교해서 다르면 트리거를 실행을 하거나
업데이트할 컬럼을 명시해줘야한다.
이 부분은 추후에 작성해보자.
--
업데이트할 컬럼이라고 했는데
오라클만 가능하고
MySQL은 불가능하다고 한다.
MySQL이나 Mariadb는 OLD와 NEW를 비교해서 IF문으로 처리 해야한다고 한다.