fix(db): V37 crashed boot — company was redefined via CREATE IF NOT EXISTS (no-op) then indexed on missing column

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 <noreply@anthropic.com>
This commit is contained in:
zio 2026-07-12 16:04:24 +09:00
parent 5ddd7136a9
commit 69a8b5288d
2 changed files with 23 additions and 16 deletions

View File

@ -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);
-- ============================================================================

View File

@ -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;