152 lines
4.1 KiB
Markdown
152 lines
4.1 KiB
Markdown
|
|
# 채번 규칙 마이그레이션 오류 긴급 수정
|
||
|
|
|
||
|
|
## 🚨 발생한 오류들
|
||
|
|
|
||
|
|
### 오류 1: check_table_scope_requires_table_name
|
||
|
|
```
|
||
|
|
SQL Error [23514]: ERROR: new row for relation "numbering_rules" violates check constraint "check_table_scope_requires_table_name"
|
||
|
|
```
|
||
|
|
**원인**: `scope_type='table'`인데 `table_name=NULL`
|
||
|
|
|
||
|
|
### 오류 2: check_global_scope_no_table_name
|
||
|
|
```
|
||
|
|
SQL Error [23514]: ERROR: new row for relation "numbering_rules" violates check constraint "check_global_scope_no_table_name"
|
||
|
|
```
|
||
|
|
**원인**: `scope_type='global'`인데 `table_name=''` (빈 문자열)
|
||
|
|
|
||
|
|
### 근본 원인
|
||
|
|
마이그레이션이 부분적으로 실행되어 데이터와 제약조건이 불일치 상태입니다.
|
||
|
|
|
||
|
|
## ✅ 해결 방법
|
||
|
|
|
||
|
|
### 🎯 가장 쉬운 방법 (권장)
|
||
|
|
|
||
|
|
**PgAdmin 또는 DBeaver에서 `046_SIMPLE_FIX.sql` 실행**
|
||
|
|
|
||
|
|
이 파일은 다음을 자동으로 처리합니다:
|
||
|
|
1. ✅ 기존 제약조건 모두 제거
|
||
|
|
2. ✅ `table_name` NULL → 빈 문자열로 변경
|
||
|
|
3. ✅ `scope_type`을 모두 'table'로 변경
|
||
|
|
4. ✅ 결과 확인
|
||
|
|
|
||
|
|
```sql
|
||
|
|
-- db/migrations/046_SIMPLE_FIX.sql 전체 내용을 복사하여 실행하세요
|
||
|
|
```
|
||
|
|
|
||
|
|
**실행 후**:
|
||
|
|
- `046_update_numbering_rules_scope_type.sql` 전체 실행
|
||
|
|
- 완료!
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### 옵션 2: 명령줄에서 실행
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# 1. 긴급 수정 SQL 실행
|
||
|
|
psql -h localhost -U postgres -d ilshin -f db/fix_existing_numbering_rules.sql
|
||
|
|
|
||
|
|
# 2. 전체 마이그레이션 실행
|
||
|
|
psql -h localhost -U postgres -d ilshin -f db/migrations/046_update_numbering_rules_scope_type.sql
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### 옵션 3: Docker 컨테이너 내부에서 실행
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# 1. Docker 컨테이너 확인
|
||
|
|
docker ps | grep postgres
|
||
|
|
|
||
|
|
# 2. 컨테이너 내부 접속
|
||
|
|
docker exec -it <CONTAINER_NAME> psql -U postgres -d ilshin
|
||
|
|
|
||
|
|
# 3. SQL 실행
|
||
|
|
UPDATE numbering_rules SET table_name = '' WHERE table_name IS NULL;
|
||
|
|
|
||
|
|
# 4. 확인
|
||
|
|
SELECT COUNT(*) FROM numbering_rules WHERE table_name IS NULL;
|
||
|
|
-- 결과: 0
|
||
|
|
|
||
|
|
# 5. 종료
|
||
|
|
\q
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 🔍 왜 이 문제가 발생했나?
|
||
|
|
|
||
|
|
### 기존 마이그레이션 순서 (잘못됨)
|
||
|
|
```sql
|
||
|
|
-- 1. scope_type 변경 (먼저 실행됨)
|
||
|
|
UPDATE numbering_rules SET scope_type = 'table' WHERE scope_type IN ('global', 'menu');
|
||
|
|
|
||
|
|
-- 2. table_name 정리 (나중에 실행됨)
|
||
|
|
UPDATE numbering_rules SET table_name = '' WHERE table_name IS NULL;
|
||
|
|
|
||
|
|
-- 3. 제약조건 추가
|
||
|
|
ALTER TABLE numbering_rules ADD CONSTRAINT check_table_scope_requires_table_name ...
|
||
|
|
```
|
||
|
|
|
||
|
|
**문제점**:
|
||
|
|
- `scope_type='table'`로 변경된 후
|
||
|
|
- 아직 `table_name=NULL`인 상태
|
||
|
|
- 이 상태에서 INSERT/UPDATE 시도 시 제약조건 위반
|
||
|
|
|
||
|
|
### 수정된 마이그레이션 순서 (올바름)
|
||
|
|
```sql
|
||
|
|
-- 1. table_name 정리 (먼저 실행!)
|
||
|
|
UPDATE numbering_rules SET table_name = '' WHERE table_name IS NULL;
|
||
|
|
|
||
|
|
-- 2. scope_type 변경
|
||
|
|
UPDATE numbering_rules SET scope_type = 'table' WHERE scope_type IN ('global', 'menu');
|
||
|
|
|
||
|
|
-- 3. 제약조건 추가
|
||
|
|
ALTER TABLE numbering_rules ADD CONSTRAINT check_table_scope_requires_table_name ...
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 📋 실행 체크리스트
|
||
|
|
|
||
|
|
- [ ] 옵션 1, 2, 또는 3 중 하나 선택하여 데이터 수정 완료
|
||
|
|
- [ ] `SELECT COUNT(*) FROM numbering_rules WHERE table_name IS NULL;` 실행 → 결과가 `0`인지 확인
|
||
|
|
- [ ] 전체 마이그레이션 `046_update_numbering_rules_scope_type.sql` 실행
|
||
|
|
- [ ] 백엔드 재시작
|
||
|
|
- [ ] 프론트엔드에서 채번 규칙 테스트
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 🎯 완료 후 확인사항
|
||
|
|
|
||
|
|
### SQL로 최종 확인
|
||
|
|
```sql
|
||
|
|
-- 1. 모든 규칙이 table 타입인지
|
||
|
|
SELECT scope_type, COUNT(*)
|
||
|
|
FROM numbering_rules
|
||
|
|
GROUP BY scope_type;
|
||
|
|
-- 결과: table만 나와야 함
|
||
|
|
|
||
|
|
-- 2. table_name이 NULL인 규칙이 없는지
|
||
|
|
SELECT COUNT(*)
|
||
|
|
FROM numbering_rules
|
||
|
|
WHERE table_name IS NULL;
|
||
|
|
-- 결과: 0
|
||
|
|
|
||
|
|
-- 3. 샘플 데이터 확인
|
||
|
|
SELECT
|
||
|
|
rule_id,
|
||
|
|
rule_name,
|
||
|
|
scope_type,
|
||
|
|
table_name,
|
||
|
|
company_code
|
||
|
|
FROM numbering_rules
|
||
|
|
LIMIT 5;
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 💡 추가 정보
|
||
|
|
|
||
|
|
수정된 마이그레이션 파일(`046_update_numbering_rules_scope_type.sql`)은 이제 올바른 순서로 실행되도록 업데이트되었습니다. 하지만 **이미 실행된 부분적인 마이그레이션**으로 인해 데이터가 불일치 상태일 수 있으므로, 위의 긴급 수정을 먼저 실행하는 것이 안전합니다.
|
||
|
|
|