feat: restore legacy named playlist workflows
This commit is contained in:
72
docs/NXT_THEME_RESTORE_READ_ONLY_AUDIT.md
Normal file
72
docs/NXT_THEME_RESTORE_READ_ONLY_AUDIT.md
Normal file
@@ -0,0 +1,72 @@
|
||||
# NXT 테마 복원 read-only 진단
|
||||
|
||||
검증일: 2026-07-12 (KST)
|
||||
|
||||
## 결론
|
||||
|
||||
활성 NXT 테마 플레이리스트 48행(현재 고유 테마 24개)이 `PreviewEmpty`로
|
||||
차단되는 원인은 마이그레이션의 테마 제목/코드 선택이나 DB endpoint 차이가
|
||||
아니다. 현재 MariaDB의 `SB_ITEM`에는 해당 테마 구성종목 446행이 있고 그
|
||||
446행 모두 폐쇄된 X/T 종목코드 형식을 만족하지만, 원본 장면이 사용하는
|
||||
`v_all_stock` 조인에는 단 한 행도 결합되지 않는다.
|
||||
|
||||
같은 prefix 제거 규칙으로 기반 NXT 테이블을 확인하면 다음과 같다.
|
||||
|
||||
| read-only 집계 | 행 수 |
|
||||
|---|---:|
|
||||
| current theme `SB_ITEM` | 446 |
|
||||
| `N_STOCK` 결합 | 187 |
|
||||
| `N_KOSDAQ_STOCK` 결합 | 259 |
|
||||
| 두 master 결합 합계 | 446 |
|
||||
| `N_ONLINE` 결합 | 151 |
|
||||
| `N_KOSDAQ_ONLINE` 결합 | 169 |
|
||||
| 원본 `v_all_stock` 결합 | 0 |
|
||||
| non-stop / live 결합 | 0 / 0 |
|
||||
|
||||
즉 구성종목은 두 NXT master에 전부 존재하고 그중 320행은 online 테이블에도
|
||||
존재한다. 현재 `v_all_stock` 정의/데이터 범위가 이 NXT master 행을 포함하지
|
||||
않는 것이 직접 원인이다.
|
||||
|
||||
## 원본 동등성 확인
|
||||
|
||||
읽기 전용으로 조사한 원본 `s5074`, `s5077`, `s5088`은 모두 NXT 구성종목을
|
||||
다음 조건으로 읽는다.
|
||||
|
||||
```sql
|
||||
SUBSTRING(SB_ITEM.SB_I_CODE, 2, 12) = v_all_stock.F_STOCK_CODE
|
||||
```
|
||||
|
||||
새 `LegacyThemeSelectionService`와
|
||||
`LegacyNamedNxtThemeRestoreService`도 같은 prefix 제거 규칙, 같은
|
||||
`F_STOP_GUBUN = 'N'` 조건을 사용한다. 원본 설정과 현재 runtime 설정의
|
||||
host/port/database를 비밀값 없이 정규화해 비교한 결과 SHA-256과 값이
|
||||
동일했고, 실제 `DATABASE()`도 현재 runtime database와 일치했다. 서버는
|
||||
MariaDB 10.5 계열이다.
|
||||
|
||||
따라서 다른 DB를 바라보는 마이그레이션 오류가 아니며, 현 데이터 상태에서는
|
||||
원본 프로그램도 같은 `v_all_stock` 경로로 NXT 테마 구성종목을 얻지 못한다.
|
||||
|
||||
## 안전 결정
|
||||
|
||||
- 운영 DB write는 수행하지 않았다.
|
||||
- endpoint, 계정, 비밀번호, 테마/종목 제목과 코드는 출력하거나 기록하지 않았다.
|
||||
- exact, 양쪽 prefix 제거, right-six 후보도 모두 0이어서 코드 형식 추측
|
||||
fallback의 근거가 없다.
|
||||
- `N_STOCK`/`N_KOSDAQ_STOCK` 직접 fallback은 데이터를 찾지만 원본 SQL과 다른
|
||||
동작이므로 자동 적용하지 않았다.
|
||||
|
||||
복구는 DBA가 `v_all_stock`의 NXT 포함 의도를 확인하고 승인된 변경/롤백
|
||||
계획으로 view를 교정하거나, 제품 요구사항으로 원본과 다른 NXT master 직접
|
||||
경로를 명시적으로 승인한 뒤 진행해야 한다. 그 전까지 복원은 `PreviewEmpty`로
|
||||
fail-closed 상태를 유지한다.
|
||||
|
||||
## 재현
|
||||
|
||||
```powershell
|
||||
dotnet run --project .\tools\MBN_STOCK_WEBVIEW.DbSmoke\MBN_STOCK_WEBVIEW.DbSmoke.csproj `
|
||||
-c Release --no-restore
|
||||
```
|
||||
|
||||
스모크는 식별자를 출력하지 않고 endpoint equality, aggregate join 수,
|
||||
분류(`VAllStockExcludesCurrentNxtMasterRows`)만 출력한다. 전체 결과는
|
||||
`REAL_DB_SMOKE: PASS`여야 한다.
|
||||
Reference in New Issue
Block a user