wing-ops/database/schema/03_org_user_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

84 lines
3.8 KiB
SQL

-- WING-OPS Database Schema: Org & User Tables
-- wing 스키마 조직/사용자 테이블
-- (pg_dump에 없음, init.sql 기반으로 wing 스키마 변환)
-- ============================================================
-- 1. org — 조직 (자기참조 FK)
-- ============================================================
CREATE TABLE wing.org (
org_sn integer NOT NULL,
org_nm character varying(100) NOT NULL,
org_abbr_nm character varying(20) NOT NULL,
org_tp_cd character varying(20) NOT NULL,
upper_org_sn integer,
reg_dtm timestamp with time zone DEFAULT now() NOT NULL,
CONSTRAINT pk_org PRIMARY KEY (org_sn)
);
CREATE SEQUENCE wing.org_org_sn_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER SEQUENCE wing.org_org_sn_seq OWNED BY wing.org.org_sn;
ALTER TABLE ONLY wing.org ALTER COLUMN org_sn SET DEFAULT nextval('wing.org_org_sn_seq'::regclass);
COMMENT ON TABLE wing.org IS '조직';
COMMENT ON COLUMN wing.org.org_sn IS '조직순번';
COMMENT ON COLUMN wing.org.org_nm IS '조직명 (기관 전체 명칭)';
COMMENT ON COLUMN wing.org.org_abbr_nm IS '조직약칭명 (기관 약칭)';
COMMENT ON COLUMN wing.org.org_tp_cd IS '조직유형코드 (ORG_TP: headquarters, regional, station, agency)';
COMMENT ON COLUMN wing.org.upper_org_sn IS '상위조직순번 (상위 기관 참조)';
COMMENT ON COLUMN wing.org.reg_dtm IS '등록일시';
-- ============================================================
-- 2. user_info — 사용자정보 (FK: wing.org)
-- (USER는 PostgreSQL 예약어이므로 user_info 사용)
-- ============================================================
CREATE TABLE wing.user_info (
user_id uuid DEFAULT public.uuid_generate_v4() NOT NULL,
user_acnt character varying(50) NOT NULL,
pswd_hash character varying(255) NOT NULL,
user_nm character varying(50) NOT NULL,
rnkp_nm character varying(30),
org_sn integer,
role_cd character varying(20) DEFAULT 'USER'::character varying NOT NULL,
actv_yn character(1) DEFAULT 'Y'::bpchar NOT NULL,
reg_dtm timestamp with time zone DEFAULT now() NOT NULL,
CONSTRAINT pk_user_info PRIMARY KEY (user_id),
CONSTRAINT uk_user_acnt UNIQUE (user_acnt),
CONSTRAINT ck_user_role_cd CHECK (((role_cd)::text = ANY (ARRAY[('ADMIN'::character varying)::text, ('MANAGER'::character varying)::text, ('USER'::character varying)::text]))),
CONSTRAINT ck_user_actv_yn CHECK ((actv_yn = ANY (ARRAY['Y'::bpchar, 'N'::bpchar])))
);
COMMENT ON TABLE wing.user_info IS '사용자정보';
COMMENT ON COLUMN wing.user_info.user_id IS '사용자아이디 (UUID)';
COMMENT ON COLUMN wing.user_info.user_acnt IS '사용자계정 (로그인 ID)';
COMMENT ON COLUMN wing.user_info.pswd_hash IS '비밀번호해시 (bcrypt 해시값)';
COMMENT ON COLUMN wing.user_info.user_nm IS '사용자명';
COMMENT ON COLUMN wing.user_info.rnkp_nm IS '직급명';
COMMENT ON COLUMN wing.user_info.org_sn IS '조직순번 (소속 조직)';
COMMENT ON COLUMN wing.user_info.role_cd IS '역할코드 (ADMIN, MANAGER, USER)';
COMMENT ON COLUMN wing.user_info.actv_yn IS '활성여부 (Y:활성, N:비활성)';
COMMENT ON COLUMN wing.user_info.reg_dtm IS '등록일시';
-- ============================================================
-- FK 제약조건
-- ============================================================
ALTER TABLE ONLY wing.org
ADD CONSTRAINT fk_org_upper FOREIGN KEY (upper_org_sn) REFERENCES wing.org(org_sn);
ALTER TABLE ONLY wing.user_info
ADD CONSTRAINT fk_user_org FOREIGN KEY (org_sn) REFERENCES wing.org(org_sn);
-- ============================================================
-- 인덱스
-- ============================================================
CREATE INDEX idx_user_org_sn ON wing.user_info USING btree (org_sn);