| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- -- 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 ;
|