wing-ops/database/schema/10_report_tables.sql
htlee 13d6ca69e2 refactor(db): DDL 스크립트 현행화 + wing_auth→auth 스키마 문서 전면 수정
- database/schema/ 14개 DDL 파일 신규 생성 (운영 DB pg_dump 기반)
- database/seed/ 14개 초기 데이터 파일 분리
- database/_deprecated/로 구 init.sql, auth_init.sql 이동
- database/README.md 신규 작성 (DB 아키텍처, 설치 절차)
- docs/ 6개 가이드 문서 wing_auth→auth 스키마 구조로 수정
- README.md, CLAUDE.md wing 단일 DB 구조 반영

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 15:16:38 +09:00

236 lines
8.9 KiB
SQL

-- WING-OPS Database Schema: Report Tables
-- wing 스키마: report_tmpl, report_tmpl_sect, report_analysis_ctgr,
-- report_ctgr_tmpl, report_ctgr_sect, report, report_sect_data
-- FK 의존성 순서: report_tmpl, report_analysis_ctgr → report → report_sect_data
-- ============================================================
-- 1. 보고서 템플릿 (report_tmpl)
-- ============================================================
CREATE TABLE wing.report_tmpl (
tmpl_sn integer NOT NULL,
tmpl_cd character varying(30) NOT NULL,
tmpl_nm character varying(100) NOT NULL,
icon character varying(10),
tmpl_dc character varying(500),
sort_ord smallint DEFAULT 0,
use_yn character(1) DEFAULT 'Y'::bpchar,
reg_dtm timestamp with time zone DEFAULT now(),
CONSTRAINT report_tmpl_pkey PRIMARY KEY (tmpl_sn),
CONSTRAINT report_tmpl_tmpl_cd_key UNIQUE (tmpl_cd)
);
CREATE SEQUENCE wing.report_tmpl_tmpl_sn_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER SEQUENCE wing.report_tmpl_tmpl_sn_seq OWNED BY wing.report_tmpl.tmpl_sn;
ALTER TABLE ONLY wing.report_tmpl ALTER COLUMN tmpl_sn SET DEFAULT nextval('wing.report_tmpl_tmpl_sn_seq'::regclass);
-- ============================================================
-- 2. 템플릿 섹션 (report_tmpl_sect)
-- ============================================================
CREATE TABLE wing.report_tmpl_sect (
sect_sn integer NOT NULL,
tmpl_sn integer NOT NULL,
sect_cd character varying(50) NOT NULL,
sect_nm character varying(100) NOT NULL,
field_def jsonb NOT NULL,
sort_ord smallint DEFAULT 0,
use_yn character(1) DEFAULT 'Y'::bpchar,
CONSTRAINT report_tmpl_sect_pkey PRIMARY KEY (sect_sn),
CONSTRAINT report_tmpl_sect_tmpl_sn_sect_cd_key UNIQUE (tmpl_sn, sect_cd)
);
CREATE SEQUENCE wing.report_tmpl_sect_sect_sn_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER SEQUENCE wing.report_tmpl_sect_sect_sn_seq OWNED BY wing.report_tmpl_sect.sect_sn;
ALTER TABLE ONLY wing.report_tmpl_sect ALTER COLUMN sect_sn SET DEFAULT nextval('wing.report_tmpl_sect_sect_sn_seq'::regclass);
-- ============================================================
-- 3. 분석 카테고리 (report_analysis_ctgr)
-- ============================================================
CREATE TABLE wing.report_analysis_ctgr (
ctgr_sn integer NOT NULL,
ctgr_cd character varying(30) NOT NULL,
ctgr_nm character varying(100) NOT NULL,
icon character varying(10),
ctgr_dc character varying(500),
color_cd character varying(30),
border_color character varying(50),
bg_active character varying(50),
report_nm character varying(100),
sort_ord smallint DEFAULT 0,
use_yn character(1) DEFAULT 'Y'::bpchar,
CONSTRAINT report_analysis_ctgr_pkey PRIMARY KEY (ctgr_sn),
CONSTRAINT report_analysis_ctgr_ctgr_cd_key UNIQUE (ctgr_cd)
);
CREATE SEQUENCE wing.report_analysis_ctgr_ctgr_sn_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER SEQUENCE wing.report_analysis_ctgr_ctgr_sn_seq OWNED BY wing.report_analysis_ctgr.ctgr_sn;
ALTER TABLE ONLY wing.report_analysis_ctgr ALTER COLUMN ctgr_sn SET DEFAULT nextval('wing.report_analysis_ctgr_ctgr_sn_seq'::regclass);
-- ============================================================
-- 4. 카테고리 템플릿 (report_ctgr_tmpl)
-- ============================================================
CREATE TABLE wing.report_ctgr_tmpl (
ctgr_tmpl_sn integer NOT NULL,
ctgr_sn integer NOT NULL,
icon character varying(10),
label character varying(50) NOT NULL,
sort_ord smallint DEFAULT 0,
CONSTRAINT report_ctgr_tmpl_pkey PRIMARY KEY (ctgr_tmpl_sn)
);
CREATE SEQUENCE wing.report_ctgr_tmpl_ctgr_tmpl_sn_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER SEQUENCE wing.report_ctgr_tmpl_ctgr_tmpl_sn_seq OWNED BY wing.report_ctgr_tmpl.ctgr_tmpl_sn;
ALTER TABLE ONLY wing.report_ctgr_tmpl ALTER COLUMN ctgr_tmpl_sn SET DEFAULT nextval('wing.report_ctgr_tmpl_ctgr_tmpl_sn_seq'::regclass);
-- ============================================================
-- 5. 카테고리 섹션 (report_ctgr_sect)
-- ============================================================
CREATE TABLE wing.report_ctgr_sect (
sect_sn integer NOT NULL,
ctgr_sn integer NOT NULL,
sect_cd character varying(50) NOT NULL,
sect_nm character varying(100) NOT NULL,
icon character varying(10),
sect_dc character varying(200),
dflt_yn character(1) DEFAULT 'Y'::bpchar,
sort_ord smallint DEFAULT 0,
CONSTRAINT report_ctgr_sect_pkey PRIMARY KEY (sect_sn),
CONSTRAINT report_ctgr_sect_ctgr_sn_sect_cd_key UNIQUE (ctgr_sn, sect_cd)
);
CREATE SEQUENCE wing.report_ctgr_sect_sect_sn_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER SEQUENCE wing.report_ctgr_sect_sect_sn_seq OWNED BY wing.report_ctgr_sect.sect_sn;
ALTER TABLE ONLY wing.report_ctgr_sect ALTER COLUMN sect_sn SET DEFAULT nextval('wing.report_ctgr_sect_sect_sn_seq'::regclass);
-- ============================================================
-- 6. 보고서 (report)
-- 의존: report_tmpl, report_analysis_ctgr, auth.auth_user, wing.acdnt
-- ============================================================
CREATE TABLE wing.report (
report_sn integer NOT NULL,
tmpl_sn integer,
ctgr_sn integer,
acdnt_sn integer,
title character varying(200) NOT NULL,
jrsd_cd character varying(20),
stts_cd character varying(20) DEFAULT 'DRAFT'::character varying,
author_id uuid NOT NULL,
use_yn character(1) DEFAULT 'Y'::bpchar,
reg_dtm timestamp with time zone DEFAULT now(),
mdfcn_dtm timestamp with time zone,
CONSTRAINT report_pkey PRIMARY KEY (report_sn),
CONSTRAINT ck_report_status CHECK (
((stts_cd)::text = ANY ((ARRAY['DRAFT'::character varying, 'IN_PROGRESS'::character varying, 'COMPLETED'::character varying])::text[]))
)
);
CREATE SEQUENCE wing.report_report_sn_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER SEQUENCE wing.report_report_sn_seq OWNED BY wing.report.report_sn;
ALTER TABLE ONLY wing.report ALTER COLUMN report_sn SET DEFAULT nextval('wing.report_report_sn_seq'::regclass);
-- ============================================================
-- 7. 보고서 섹션 데이터 (report_sect_data)
-- 의존: report
-- ============================================================
CREATE TABLE wing.report_sect_data (
data_sn integer NOT NULL,
report_sn integer NOT NULL,
sect_cd character varying(50) NOT NULL,
include_yn character(1) DEFAULT 'Y'::bpchar,
sect_data jsonb DEFAULT '{}'::jsonb NOT NULL,
sort_ord smallint DEFAULT 0,
CONSTRAINT report_sect_data_pkey PRIMARY KEY (data_sn),
CONSTRAINT report_sect_data_report_sn_sect_cd_key UNIQUE (report_sn, sect_cd)
);
CREATE SEQUENCE wing.report_sect_data_data_sn_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER SEQUENCE wing.report_sect_data_data_sn_seq OWNED BY wing.report_sect_data.data_sn;
ALTER TABLE ONLY wing.report_sect_data ALTER COLUMN data_sn SET DEFAULT nextval('wing.report_sect_data_data_sn_seq'::regclass);
-- ============================================================
-- FK 제약조건
-- ============================================================
ALTER TABLE ONLY wing.report_tmpl_sect
ADD CONSTRAINT report_tmpl_sect_tmpl_sn_fkey
FOREIGN KEY (tmpl_sn) REFERENCES wing.report_tmpl(tmpl_sn);
ALTER TABLE ONLY wing.report_ctgr_tmpl
ADD CONSTRAINT report_ctgr_tmpl_ctgr_sn_fkey
FOREIGN KEY (ctgr_sn) REFERENCES wing.report_analysis_ctgr(ctgr_sn);
ALTER TABLE ONLY wing.report_ctgr_sect
ADD CONSTRAINT report_ctgr_sect_ctgr_sn_fkey
FOREIGN KEY (ctgr_sn) REFERENCES wing.report_analysis_ctgr(ctgr_sn);
-- 크로스스키마 FK: report.author_id → auth.auth_user
ALTER TABLE ONLY wing.report
ADD CONSTRAINT report_author_id_fkey
FOREIGN KEY (author_id) REFERENCES auth.auth_user(user_id);
ALTER TABLE ONLY wing.report
ADD CONSTRAINT report_tmpl_sn_fkey
FOREIGN KEY (tmpl_sn) REFERENCES wing.report_tmpl(tmpl_sn);
ALTER TABLE ONLY wing.report
ADD CONSTRAINT report_ctgr_sn_fkey
FOREIGN KEY (ctgr_sn) REFERENCES wing.report_analysis_ctgr(ctgr_sn);
ALTER TABLE ONLY wing.report_sect_data
ADD CONSTRAINT report_sect_data_report_sn_fkey
FOREIGN KEY (report_sn) REFERENCES wing.report(report_sn) ON DELETE CASCADE;