-- DDL 007: STATUS 히스토리 테이블 분리 방안 -- 생성일: 2024-12-20 -- 목적: 메인 테이블과 히스토리 테이블을 분리하여 UNIQUE 제약조건 문제 해결 -- 1. 파트너십 상태 히스토리 테이블 생성 CREATE TABLE `VENDOR_INFLUENCER_STATUS_HISTORY` ( `SEQ` int(11) NOT NULL AUTO_INCREMENT COMMENT '기본키', `MAPPING_SEQ` int(11) NOT NULL COMMENT '매핑 테이블 SEQ 참조', `STATUS` varchar(20) NOT NULL COMMENT '상태: PENDING, APPROVED, REJECTED, TERMINATED', `PREVIOUS_STATUS` varchar(20) DEFAULT NULL COMMENT '이전 상태', `STATUS_MESSAGE` text DEFAULT NULL COMMENT '상태 변경 메시지', `CHANGED_BY` int(11) NOT NULL COMMENT '상태 변경자 SEQ', `CHANGED_DATE` timestamp NOT NULL DEFAULT current_timestamp() COMMENT '상태 변경일시', `IS_CURRENT` varchar(1) NOT NULL DEFAULT 'Y' COMMENT '현재 상태 여부: Y(현재), N(이전)', `REG_DATE` timestamp NOT NULL DEFAULT current_timestamp() COMMENT '등록일시', PRIMARY KEY (`SEQ`), INDEX `idx_mapping_seq` (`MAPPING_SEQ`), INDEX `idx_status` (`STATUS`), INDEX `idx_is_current` (`IS_CURRENT`), INDEX `idx_changed_date` (`CHANGED_DATE`), UNIQUE INDEX `unique_current_mapping` (`MAPPING_SEQ`, `IS_CURRENT`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci COMMENT='벤더사-인플루언서 상태 히스토리 테이블'; -- 2. 메인 테이블 구조 단순화 -- STATUS 컬럼을 제거하고 현재 상태는 히스토리 테이블에서 조회 ALTER TABLE `VENDOR_INFLUENCER_MAPPING` DROP COLUMN `STATUS`; -- 3. 외래키 제약조건 추가 ALTER TABLE `VENDOR_INFLUENCER_STATUS_HISTORY` ADD CONSTRAINT `fk_status_history_mapping` FOREIGN KEY (`MAPPING_SEQ`) REFERENCES `VENDOR_INFLUENCER_MAPPING`(`SEQ`) ON DELETE CASCADE ON UPDATE CASCADE; -- 4. 기존 데이터 마이그레이션 (백업 후 실행) -- 주의: 실제 운영 환경에서는 백업 후 실행 필요 INSERT INTO `VENDOR_INFLUENCER_STATUS_HISTORY` (`MAPPING_SEQ`, `STATUS`, `STATUS_MESSAGE`, `CHANGED_BY`, `CHANGED_DATE`, `IS_CURRENT`) SELECT `SEQ` as `MAPPING_SEQ`, 'PENDING' as `STATUS`, -- 기본값으로 설정 `REQUEST_MESSAGE` as `STATUS_MESSAGE`, `REQUESTED_BY` as `CHANGED_BY`, `REG_DATE` as `CHANGED_DATE`, 'Y' as `IS_CURRENT` FROM `VENDOR_INFLUENCER_MAPPING` WHERE `IS_ACT` = 'Y'; -- 5. 현재 상태 조회를 위한 VIEW 생성 CREATE VIEW `V_VENDOR_INFLUENCER_CURRENT_STATUS` AS SELECT m.`SEQ`, m.`VENDOR_SEQ`, m.`INFLUENCER_SEQ`, m.`REQUEST_TYPE`, h.`STATUS` as `CURRENT_STATUS`, h.`STATUS_MESSAGE` as `CURRENT_STATUS_MESSAGE`, m.`REQUEST_MESSAGE`, m.`RESPONSE_MESSAGE`, m.`REQUESTED_BY`, m.`APPROVED_BY`, m.`REQUEST_DATE`, m.`RESPONSE_DATE`, m.`EXPIRED_DATE`, m.`PARTNERSHIP_START_DATE`, m.`PARTNERSHIP_END_DATE`, m.`COMMISSION_RATE`, m.`SPECIAL_CONDITIONS`, m.`IS_ACT`, m.`REG_DATE`, m.`MOD_DATE`, m.`ADD_INFO1`, m.`ADD_INFO2`, m.`ADD_INFO3` FROM `VENDOR_INFLUENCER_MAPPING` m JOIN `VENDOR_INFLUENCER_STATUS_HISTORY` h ON m.`SEQ` = h.`MAPPING_SEQ` AND h.`IS_CURRENT` = 'Y' WHERE m.`IS_ACT` = 'Y'; -- 6. 상태 변경을 위한 저장 프로시저 DELIMITER // CREATE PROCEDURE `SP_CHANGE_PARTNERSHIP_STATUS`( IN p_mapping_seq INT, IN p_new_status VARCHAR(20), IN p_status_message TEXT, IN p_changed_by INT ) BEGIN DECLARE v_current_status VARCHAR(20); -- 트랜잭션 시작 START TRANSACTION; -- 현재 상태 조회 SELECT `STATUS` INTO v_current_status FROM `VENDOR_INFLUENCER_STATUS_HISTORY` WHERE `MAPPING_SEQ` = p_mapping_seq AND `IS_CURRENT` = 'Y'; -- 기존 현재 상태를 이전 상태로 변경 UPDATE `VENDOR_INFLUENCER_STATUS_HISTORY` SET `IS_CURRENT` = 'N' WHERE `MAPPING_SEQ` = p_mapping_seq AND `IS_CURRENT` = 'Y'; -- 새로운 상태 히스토리 추가 INSERT INTO `VENDOR_INFLUENCER_STATUS_HISTORY` (`MAPPING_SEQ`, `STATUS`, `PREVIOUS_STATUS`, `STATUS_MESSAGE`, `CHANGED_BY`, `IS_CURRENT`) VALUES (p_mapping_seq, p_new_status, v_current_status, p_status_message, p_changed_by, 'Y'); -- 메인 테이블의 MOD_DATE 업데이트 UPDATE `VENDOR_INFLUENCER_MAPPING` SET `MOD_DATE` = NOW() WHERE `SEQ` = p_mapping_seq; COMMIT; END // DELIMITER ;