-- =============================================================
-- SNP Connection Monitoring - 파티션 마이그레이션
-- snp_api_request_log 테이블을 월별 Range 파티션으로 전환
-- 스키마: common
--
-- 주의: 운영 DB에서 수동 실행. 서비스 중지 후 진행 권장.
-- =============================================================

BEGIN;

-- 1. 기존 데이터 백업
CREATE TABLE common.snp_api_request_log_backup AS
SELECT * FROM common.snp_api_request_log;

-- 2. 기존 테이블 삭제
DROP TABLE IF EXISTS common.snp_api_request_log CASCADE;

-- 3. 파티션 테이블 생성
CREATE TABLE common.snp_api_request_log (
    log_id          BIGSERIAL,
    request_url     VARCHAR(2000),
    request_params  TEXT,
    request_method  VARCHAR(10),
    request_status  VARCHAR(20),
    request_headers TEXT,
    request_ip      VARCHAR(45),
    service_id      BIGINT,
    user_id         BIGINT,
    api_key_id      BIGINT,
    response_size   BIGINT,
    response_time   INTEGER,
    response_status INTEGER,
    error_message   TEXT,
    requested_at    TIMESTAMP NOT NULL DEFAULT NOW(),
    tenant_id       BIGINT,
    PRIMARY KEY (log_id, requested_at)
) PARTITION BY RANGE (requested_at);

-- 4. 현재 월 + 미래 2개월 파티션 생성 (실행 시점에 맞게 날짜 수정)
-- 예시: 2026년 4월 실행 기준
CREATE TABLE common.snp_api_request_log_202604
    PARTITION OF common.snp_api_request_log
    FOR VALUES FROM ('2026-04-01') TO ('2026-05-01');

CREATE TABLE common.snp_api_request_log_202605
    PARTITION OF common.snp_api_request_log
    FOR VALUES FROM ('2026-05-01') TO ('2026-06-01');

CREATE TABLE common.snp_api_request_log_202606
    PARTITION OF common.snp_api_request_log
    FOR VALUES FROM ('2026-06-01') TO ('2026-07-01');

-- 5. 인덱스 재생성 (파티션 테이블에 자동 상속됨)
CREATE INDEX idx_snp_request_log_service ON common.snp_api_request_log (service_id);
CREATE INDEX idx_snp_request_log_user ON common.snp_api_request_log (user_id);
CREATE INDEX idx_snp_request_log_requested ON common.snp_api_request_log (requested_at);
CREATE INDEX idx_snp_request_log_tenant ON common.snp_api_request_log (tenant_id);
CREATE INDEX idx_snp_request_log_daily_stats ON common.snp_api_request_log (requested_at, request_status);
CREATE INDEX idx_snp_request_log_daily_user ON common.snp_api_request_log (requested_at, user_id);
CREATE INDEX idx_snp_request_log_svc_stats ON common.snp_api_request_log (requested_at, service_id, request_status);
CREATE INDEX idx_snp_request_log_top_api ON common.snp_api_request_log (requested_at, request_url, request_method);

-- 6. 데이터 복원
INSERT INTO common.snp_api_request_log SELECT * FROM common.snp_api_request_log_backup;

-- 7. 백업 테이블 삭제 (데이터 복원 확인 후)
-- DROP TABLE common.snp_api_request_log_backup;

COMMIT;
