From 69a8b5288d88c82dcec7140caeb09300f56e3943 Mon Sep 17 00:00:00 2001 From: zio Date: Sun, 12 Jul 2026 16:04:24 +0900 Subject: [PATCH] =?UTF-8?q?fix(db):=20V37=20crashed=20boot=20=E2=80=94=20c?= =?UTF-8?q?ompany=20was=20redefined=20via=20CREATE=20IF=20NOT=20EXISTS=20(?= =?UTF-8?q?no-op)=20then=20indexed=20on=20missing=20column?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit V2 already has `company` (id PK, name/registration_no/phone). V37's CREATE TABLE IF NOT EXISTS company was a no-op, so the follow-up `CREATE INDEX ON company (tenant_id, company_name)` hit "column tenant_id does not exist", failing Flyway and rolling the deploy back to the old jar (V36). Fix: expand the existing V2 company via idempotent ALTER ADD COLUMN + backfill (name->company_name, registration_no->biz_no, phone->contact_tel). V38 re-backfills new rows. Verified by BEGIN...ROLLBACK dry-run of V37+V38 against the live schema (0 errors). Local unit tests don't execute Flyway, so this class of error only surfaces at boot — same lesson as V17/V19. Dry-run against real schema before deploy for migrations touching legacy tables. Co-Authored-By: Claude Fable 5 --- .../db/migration/V37__system_basics.sql | 34 ++++++++++--------- .../db/migration/V38__demo_seed_full.sql | 5 +++ 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/backend/src/main/resources/db/migration/V37__system_basics.sql b/src/backend/src/main/resources/db/migration/V37__system_basics.sql index f3cbda4..4021f76 100644 --- a/src/backend/src/main/resources/db/migration/V37__system_basics.sql +++ b/src/backend/src/main/resources/db/migration/V37__system_basics.sql @@ -21,22 +21,24 @@ CREATE TABLE IF NOT EXISTS dept ( ); CREATE INDEX IF NOT EXISTS idx_dept_parent ON dept (tenant_id, parent_id, sort_order); -CREATE TABLE IF NOT EXISTS company ( - tenant_id varchar(40) NOT NULL DEFAULT 'KINTEX', - id varchar(40) NOT NULL, - company_name varchar(200) NOT NULL, - biz_no varchar(40), - ceo_name varchar(120), - biz_type varchar(120), - contact_name varchar(120), - contact_tel varchar(60), -- 저장은 원문, 응답은 마스킹(코드 계층) - address varchar(400), - partner_type varchar(40), -- 공통코드(PARTNER_TYPE) 값 - use_yn char(1) NOT NULL DEFAULT 'Y', - created_at timestamptz NOT NULL DEFAULT now(), - updated_at timestamptz NOT NULL DEFAULT now(), - PRIMARY KEY (tenant_id, id) -); +-- ★company 는 V2 에 이미 존재하는 마스터(공사/등록업체) — 재정의(CREATE)하면 no-op 라 신규 컬럼이 안 생겨 +-- 후행 인덱스가 없는 컬럼을 참조해 실패한다(2026-07-12 배포 크래시). 기존 테이블을 멱등 ALTER 로 확장한다. +-- PK(id)·기존 컬럼(name·registration_no·phone·registered·category)은 불변 — auction 등 FK 참조 보존. +ALTER TABLE company ADD COLUMN IF NOT EXISTS tenant_id varchar(40) NOT NULL DEFAULT 'KINTEX'; +ALTER TABLE company ADD COLUMN IF NOT EXISTS company_name varchar(200); +ALTER TABLE company ADD COLUMN IF NOT EXISTS biz_no varchar(40); +ALTER TABLE company ADD COLUMN IF NOT EXISTS ceo_name varchar(120); +ALTER TABLE company ADD COLUMN IF NOT EXISTS biz_type varchar(120); +ALTER TABLE company ADD COLUMN IF NOT EXISTS contact_name varchar(120); +ALTER TABLE company ADD COLUMN IF NOT EXISTS contact_tel varchar(60); -- 저장 원문, 응답 마스킹(코드 계층) +ALTER TABLE company ADD COLUMN IF NOT EXISTS address varchar(400); +ALTER TABLE company ADD COLUMN IF NOT EXISTS partner_type varchar(40); -- 공통코드(PARTNER_TYPE) +ALTER TABLE company ADD COLUMN IF NOT EXISTS use_yn char(1) NOT NULL DEFAULT 'Y'; +ALTER TABLE company ADD COLUMN IF NOT EXISTS updated_at timestamptz NOT NULL DEFAULT now(); +-- V2 기존 컬럼 → W12 컬럼 백필(멱등) +UPDATE company SET company_name = name WHERE company_name IS NULL AND name IS NOT NULL; +UPDATE company SET biz_no = registration_no WHERE biz_no IS NULL AND registration_no IS NOT NULL; +UPDATE company SET contact_tel = phone WHERE contact_tel IS NULL AND phone IS NOT NULL; CREATE INDEX IF NOT EXISTS idx_company_name ON company (tenant_id, company_name); -- ============================================================================ diff --git a/src/backend/src/main/resources/db/migration/V38__demo_seed_full.sql b/src/backend/src/main/resources/db/migration/V38__demo_seed_full.sql index a4256bf..bb63556 100644 --- a/src/backend/src/main/resources/db/migration/V38__demo_seed_full.sql +++ b/src/backend/src/main/resources/db/migration/V38__demo_seed_full.sql @@ -544,3 +544,8 @@ ON CONFLICT (id) DO NOTHING; -- -- 부스 판매분포: SELECT status,count(*) FROM booth_sale WHERE event_id='e-2026-smf' GROUP BY status; -- -- 리드 15/핫4: SELECT count(*), count(*) FILTER(WHERE score>=80) FROM lead WHERE event_id='e-2026-smf'; -- ============================================================================ + +-- 신규 company 행 company_name 정합(V37 이 name→company_name 백필하나 본 파일 신규행은 V37 이후 삽입되므로 재백필). +UPDATE company SET company_name = name WHERE company_name IS NULL AND name IS NOT NULL; +UPDATE company SET biz_no = registration_no WHERE biz_no IS NULL AND registration_no IS NOT NULL; +UPDATE company SET contact_tel = phone WHERE contact_tel IS NULL AND phone IS NOT NULL;