007_create_status_history_table.sql 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. -- DDL 007: STATUS 히스토리 테이블 분리 방안
  2. -- 생성일: 2024-12-20
  3. -- 목적: 메인 테이블과 히스토리 테이블을 분리하여 UNIQUE 제약조건 문제 해결
  4. -- 1. 파트너십 상태 히스토리 테이블 생성
  5. CREATE TABLE `VENDOR_INFLUENCER_STATUS_HISTORY` (
  6. `SEQ` int(11) NOT NULL AUTO_INCREMENT COMMENT '기본키',
  7. `MAPPING_SEQ` int(11) NOT NULL COMMENT '매핑 테이블 SEQ 참조',
  8. `STATUS` varchar(20) NOT NULL COMMENT '상태: PENDING, APPROVED, REJECTED, TERMINATED',
  9. `PREVIOUS_STATUS` varchar(20) DEFAULT NULL COMMENT '이전 상태',
  10. `STATUS_MESSAGE` text DEFAULT NULL COMMENT '상태 변경 메시지',
  11. `CHANGED_BY` int(11) NOT NULL COMMENT '상태 변경자 SEQ',
  12. `CHANGED_DATE` timestamp NOT NULL DEFAULT current_timestamp() COMMENT '상태 변경일시',
  13. `IS_CURRENT` varchar(1) NOT NULL DEFAULT 'Y' COMMENT '현재 상태 여부: Y(현재), N(이전)',
  14. `REG_DATE` timestamp NOT NULL DEFAULT current_timestamp() COMMENT '등록일시',
  15. PRIMARY KEY (`SEQ`),
  16. INDEX `idx_mapping_seq` (`MAPPING_SEQ`),
  17. INDEX `idx_status` (`STATUS`),
  18. INDEX `idx_is_current` (`IS_CURRENT`),
  19. INDEX `idx_changed_date` (`CHANGED_DATE`),
  20. UNIQUE INDEX `unique_current_mapping` (`MAPPING_SEQ`, `IS_CURRENT`)
  21. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci
  22. COMMENT='벤더사-인플루언서 상태 히스토리 테이블';
  23. -- 2. 메인 테이블 구조 단순화
  24. -- STATUS 컬럼을 제거하고 현재 상태는 히스토리 테이블에서 조회
  25. ALTER TABLE `VENDOR_INFLUENCER_MAPPING`
  26. DROP COLUMN `STATUS`;
  27. -- 3. 외래키 제약조건 추가
  28. ALTER TABLE `VENDOR_INFLUENCER_STATUS_HISTORY`
  29. ADD CONSTRAINT `fk_status_history_mapping`
  30. FOREIGN KEY (`MAPPING_SEQ`) REFERENCES `VENDOR_INFLUENCER_MAPPING`(`SEQ`)
  31. ON DELETE CASCADE ON UPDATE CASCADE;
  32. -- 4. 기존 데이터 마이그레이션 (백업 후 실행)
  33. -- 주의: 실제 운영 환경에서는 백업 후 실행 필요
  34. INSERT INTO `VENDOR_INFLUENCER_STATUS_HISTORY`
  35. (`MAPPING_SEQ`, `STATUS`, `STATUS_MESSAGE`, `CHANGED_BY`, `CHANGED_DATE`, `IS_CURRENT`)
  36. SELECT
  37. `SEQ` as `MAPPING_SEQ`,
  38. 'PENDING' as `STATUS`, -- 기본값으로 설정
  39. `REQUEST_MESSAGE` as `STATUS_MESSAGE`,
  40. `REQUESTED_BY` as `CHANGED_BY`,
  41. `REG_DATE` as `CHANGED_DATE`,
  42. 'Y' as `IS_CURRENT`
  43. FROM `VENDOR_INFLUENCER_MAPPING`
  44. WHERE `IS_ACT` = 'Y';
  45. -- 5. 현재 상태 조회를 위한 VIEW 생성
  46. CREATE VIEW `V_VENDOR_INFLUENCER_CURRENT_STATUS` AS
  47. SELECT
  48. m.`SEQ`,
  49. m.`VENDOR_SEQ`,
  50. m.`INFLUENCER_SEQ`,
  51. m.`REQUEST_TYPE`,
  52. h.`STATUS` as `CURRENT_STATUS`,
  53. h.`STATUS_MESSAGE` as `CURRENT_STATUS_MESSAGE`,
  54. m.`REQUEST_MESSAGE`,
  55. m.`RESPONSE_MESSAGE`,
  56. m.`REQUESTED_BY`,
  57. m.`APPROVED_BY`,
  58. m.`REQUEST_DATE`,
  59. m.`RESPONSE_DATE`,
  60. m.`EXPIRED_DATE`,
  61. m.`PARTNERSHIP_START_DATE`,
  62. m.`PARTNERSHIP_END_DATE`,
  63. m.`COMMISSION_RATE`,
  64. m.`SPECIAL_CONDITIONS`,
  65. m.`IS_ACT`,
  66. m.`REG_DATE`,
  67. m.`MOD_DATE`,
  68. m.`ADD_INFO1`,
  69. m.`ADD_INFO2`,
  70. m.`ADD_INFO3`
  71. FROM `VENDOR_INFLUENCER_MAPPING` m
  72. JOIN `VENDOR_INFLUENCER_STATUS_HISTORY` h
  73. ON m.`SEQ` = h.`MAPPING_SEQ`
  74. AND h.`IS_CURRENT` = 'Y'
  75. WHERE m.`IS_ACT` = 'Y';
  76. -- 6. 상태 변경을 위한 저장 프로시저
  77. DELIMITER //
  78. CREATE PROCEDURE `SP_CHANGE_PARTNERSHIP_STATUS`(
  79. IN p_mapping_seq INT,
  80. IN p_new_status VARCHAR(20),
  81. IN p_status_message TEXT,
  82. IN p_changed_by INT
  83. )
  84. BEGIN
  85. DECLARE v_current_status VARCHAR(20);
  86. -- 트랜잭션 시작
  87. START TRANSACTION;
  88. -- 현재 상태 조회
  89. SELECT `STATUS` INTO v_current_status
  90. FROM `VENDOR_INFLUENCER_STATUS_HISTORY`
  91. WHERE `MAPPING_SEQ` = p_mapping_seq AND `IS_CURRENT` = 'Y';
  92. -- 기존 현재 상태를 이전 상태로 변경
  93. UPDATE `VENDOR_INFLUENCER_STATUS_HISTORY`
  94. SET `IS_CURRENT` = 'N'
  95. WHERE `MAPPING_SEQ` = p_mapping_seq AND `IS_CURRENT` = 'Y';
  96. -- 새로운 상태 히스토리 추가
  97. INSERT INTO `VENDOR_INFLUENCER_STATUS_HISTORY`
  98. (`MAPPING_SEQ`, `STATUS`, `PREVIOUS_STATUS`, `STATUS_MESSAGE`, `CHANGED_BY`, `IS_CURRENT`)
  99. VALUES
  100. (p_mapping_seq, p_new_status, v_current_status, p_status_message, p_changed_by, 'Y');
  101. -- 메인 테이블의 MOD_DATE 업데이트
  102. UPDATE `VENDOR_INFLUENCER_MAPPING`
  103. SET `MOD_DATE` = NOW()
  104. WHERE `SEQ` = p_mapping_seq;
  105. COMMIT;
  106. END //
  107. DELIMITER ;