04cfac6eff
PR-A 베이스라인 사전 작업. 후속 백엔드/프론트 PR 의 의존성. DDL (400_mbom.sql): - mbom_header (21 cols) — PK objid varchar(64), UNIQUE mbom_no FK source_ebom_objid → part_bom_report.objid (SET NULL) FK source_mbom_objid → mbom_header.objid (SET NULL, self) - mbom_detail (47 cols) — PK objid varchar(64) FK mbom_header_objid → mbom_header.objid (CASCADE) FK part_objid → part_mng.objid (SET NULL) - 인덱스 11개 (project/source/status/header/parent/part 등) 운영DB vs RPS 타입 함정 정정: - 운영 part_mng.objid varchar(64) → RPS bigint (feedback_createobjid_pattern.md) - mbom_detail.part_objid 도 bigint 로 통일해 FK 호환 - numeric/varchar 모두 bigint 와 FK 불가 — 정확한 타입 매칭 필요 운영 sample 이관 (01_mbom_sync.sql): - mbom_header 3 / mbom_detail 95 → RPS 전이 - staging 테이블 패턴 (LIKE INCLUDING DEFAULTS, FK·PK 제거) - FK 매칭 안 되는 source_ebom_objid / part_objid 는 NULL 처리 - mbom_header 에 없는 mbom_header_objid 행은 DELETE (orphan 방지) - part_objid varchar(64) → bigint 형변환 (운영 String.hashCode 결과) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
64 lines
3.4 KiB
SQL
64 lines
3.4 KiB
SQL
-- ============================================================
|
|
-- M-BOM 운영 sample 데이터 → RPS 이관
|
|
-- 운영: 211.115.91.141:11133/waceplm (mbom_header 3건, mbom_detail 95건)
|
|
-- 대상: 211.115.91.141:11134/vexplor_rps
|
|
--
|
|
-- 함정:
|
|
-- 1) mbom_header.source_ebom_objid → RPS part_bom_report 에 없는 OBJID 는 NULL 처리
|
|
-- 2) mbom_detail.part_objid varchar → RPS bigint (FK part_mng.objid bigint 호환)
|
|
-- 3) RPS part_mng 에 없는 part_objid 도 NULL 처리
|
|
--
|
|
-- 실행 전: /tmp/mbom_header.csv, /tmp/mbom_detail.csv 준비 (운영DB \copy TO)
|
|
-- ============================================================
|
|
|
|
-- ── mbom_header ───────────────────────────────────────────────
|
|
DROP TABLE IF EXISTS mbom_header_stage;
|
|
CREATE TABLE mbom_header_stage (LIKE mbom_header INCLUDING DEFAULTS);
|
|
ALTER TABLE mbom_header_stage DROP CONSTRAINT IF EXISTS mbom_header_pkey;
|
|
ALTER TABLE mbom_header_stage DROP CONSTRAINT IF EXISTS mbom_header_mbom_no_key;
|
|
ALTER TABLE mbom_header_stage DROP CONSTRAINT IF EXISTS fk_mbom_source_ebom;
|
|
ALTER TABLE mbom_header_stage DROP CONSTRAINT IF EXISTS fk_mbom_source_mbom;
|
|
|
|
\copy mbom_header_stage FROM '/tmp/mbom_header.csv' WITH CSV HEADER
|
|
|
|
-- RPS part_bom_report 에 없는 source_ebom_objid 는 NULL
|
|
UPDATE mbom_header_stage SET source_ebom_objid = NULL
|
|
WHERE source_ebom_objid IS NOT NULL
|
|
AND NOT EXISTS (SELECT 1 FROM part_bom_report WHERE objid = mbom_header_stage.source_ebom_objid);
|
|
|
|
-- self FK source_mbom_objid: 자기 자신 OBJID 셋에 있으면 OK, 아니면 NULL
|
|
UPDATE mbom_header_stage SET source_mbom_objid = NULL
|
|
WHERE source_mbom_objid IS NOT NULL
|
|
AND source_mbom_objid NOT IN (SELECT objid FROM mbom_header_stage);
|
|
|
|
INSERT INTO mbom_header SELECT * FROM mbom_header_stage;
|
|
DROP TABLE mbom_header_stage;
|
|
|
|
-- ── mbom_detail ────────────────────────────────────────────────
|
|
DROP TABLE IF EXISTS mbom_detail_stage;
|
|
CREATE TABLE mbom_detail_stage (LIKE mbom_detail INCLUDING DEFAULTS);
|
|
ALTER TABLE mbom_detail_stage DROP CONSTRAINT IF EXISTS mbom_detail_pkey;
|
|
ALTER TABLE mbom_detail_stage DROP CONSTRAINT IF EXISTS fk_mbom_detail_header;
|
|
ALTER TABLE mbom_detail_stage DROP CONSTRAINT IF EXISTS fk_mbom_detail_part;
|
|
ALTER TABLE mbom_detail_stage ALTER COLUMN part_objid TYPE varchar(64) USING part_objid::text;
|
|
|
|
\copy mbom_detail_stage FROM '/tmp/mbom_detail.csv' WITH CSV HEADER
|
|
|
|
-- RPS part_mng 에 없는 part_objid 는 NULL (bigint 형변환 안전)
|
|
UPDATE mbom_detail_stage SET part_objid = NULL
|
|
WHERE part_objid IS NOT NULL
|
|
AND NOT EXISTS (SELECT 1 FROM part_mng WHERE objid::text = mbom_detail_stage.part_objid);
|
|
|
|
-- RPS mbom_header 에 없는 mbom_header_objid 행은 import 제외
|
|
DELETE FROM mbom_detail_stage
|
|
WHERE NOT EXISTS (SELECT 1 FROM mbom_header WHERE objid = mbom_detail_stage.mbom_header_objid);
|
|
|
|
-- bigint 형변환 후 본 테이블 INSERT
|
|
ALTER TABLE mbom_detail_stage ALTER COLUMN part_objid TYPE bigint USING part_objid::bigint;
|
|
INSERT INTO mbom_detail SELECT * FROM mbom_detail_stage;
|
|
DROP TABLE mbom_detail_stage;
|
|
|
|
-- ── 결과 ──────────────────────────────────────────────────────
|
|
SELECT 'mbom_header' AS t, COUNT(*) FROM mbom_header
|
|
UNION ALL SELECT 'mbom_detail', COUNT(*) FROM mbom_detail;
|