# 080 마이그레이션 실행 가이드 — DB_NAME UNIQUE + race condition 방어

작성일: 2026-04-24
작성자: gbpark
관련: Codex 리뷰 #4 — ProvisioningController 중복 체크 race condition 방어

## 목적

회사 프로비저닝 중복 체크와 INSERT 사이 **race condition** 을 DB 레벨에서 차단.

- 현재 Controller: `exists → insert` 두 단계 사이 동시에 같은 subdomain 요청 들어오면 둘 다 통과 → DB 두 건 INSERT.
- 해결: `SUBDOMAIN`, `DB_NAME` 에 UNIQUE 제약. INSERT 실패 시 `DuplicateKeyException` → Controller 에서 409 응답.
- `SUBDOMAIN` UNIQUE 는 079 마이그레이션에 이미 포함됨. 이번엔 `DB_NAME` 만 추가.

## SQL

```sql
-- 080: DB_NAME UNIQUE 제약
CREATE UNIQUE INDEX IF NOT EXISTS UX_COMPANY_MNG_DB_NAME
  ON COMPANY_MNG (DB_NAME)
  WHERE DB_NAME IS NOT NULL;
```

> `COMPANY_CODE` 는 이미 테이블 생성 시 PK 이므로 별도 제약 불필요.

## 실행 방법

### DBeaver / pgAdmin
위 SQL 블록을 `invyone` DB 에 실행.

### psql
```bash
psql -h 183.99.177.40 -U postgres -d invyone <<'SQL'
CREATE UNIQUE INDEX IF NOT EXISTS UX_COMPANY_MNG_DB_NAME
  ON COMPANY_MNG (DB_NAME)
  WHERE DB_NAME IS NOT NULL;
SQL
```

## 확인 쿼리

```sql
SELECT indexname, indexdef FROM pg_indexes
 WHERE tablename = 'company_mng'
   AND indexname IN ('ux_company_mng_subdomain', 'ux_company_mng_db_name');
```

## 롤백

```sql
DROP INDEX IF EXISTS UX_COMPANY_MNG_DB_NAME;
```
