產生:初始/範例DB的流程

This commit is contained in:
2025-12-12 09:24:22 +08:00
parent 169a771566
commit 2d3fb23c7b
76 changed files with 21689 additions and 0 deletions

187
data/initdb/readme.md Normal file
View File

@@ -0,0 +1,187 @@
# 檔名
\initdb\17168erp_schema.sql : 結構SQL
\initdb\include : 初始DB**需要**的TABLE (12個)
\initdb\exclude : 初始DB**不要**的TABLE (55個) 目前為範例資料
---
\initdb\db_init.sql : 只含include的資料列
\initdb\db_demo.sql : 含少數exclude的範例資料列
## 假資料範圍(筆數)
信眾(50?), 報名(200?), 帳戶(1?)
法會, 功德: 應可用真資料?
其它: 真假資料都不要?
如: 寮房? 掛單?
# Table名稱及建立順序 (依外鍵關聯排序include在前)
### ====== Batch 1: 無外鍵 ======
#### include
admin_group
company
country
files
item
PostCity
PostNumber
AncestralTabletStatus
RegionRoomBedStatus
RegionType
stock_reason
#### exclude
GuadanTimeSetting
accounting_kind
accounting_kind2
actItem_kind
activity_category_kind
activity_kind
appellation
bed_kind
member_group
member_title
news_kind
project_kind
stock_kind
supplier_kind
### ====== Batch 2 ======
#### include
admin
#### exclude
actItem
followers
activity
supplier
bed_kind_detail
AncestralTabletArea
Region
### ====== Batch 3 : exclude only ======
member
pro_order
activity_check
family_members
followers_tablet
GuaDanOrder
act_bom
actItem_files
activity_kind_detail
activity_relating
activity_spares
news
AncestralTabletPosition
Room
admin_log
### ====== Batch 4 : exclude only ======
pro_order_detail
member_check
project
news_files
AncestralTabletRegistrant
RegionRoomBed
### ====== Batch 5 : exclude only ======
bed_order
accounting
stock
project_sub
AncestralTabletPositionRecord
GuaDanOrderGuest
ShuWen
### ====== Batch 6 : exclude only ======
bed_order_detail
accounting_files
stock_files
transfer_register
RegionAndRoomAndBedSchedule
### ====== Batch 7 ======
pro_order_record
# 執行錯誤分析
## 問題 1自引用外鍵的 INSERT 順序錯誤 (68 筆錯誤)
### 受影響的表
| 表 | 自引用外鍵 | 錯誤數 |
|---|---|---|
| Region | FK_Region_ParentUuid (ParentUuid → Uuid) | 4 |
| followers | FK_followers_followers (leader → num) | 1 |
### 範例Region.Table.sql 順序錯誤
```
第1行三樓男眾寮房ParentUuid = 455... → 引用第3行 ❌
第2行十樓ParentUuid = 1cc... → 引用第5行 ❌
第3行三樓ParentUuid = 1cc... → 引用第5行 ❌
第4行十樓女眾寮房ParentUuid = 629... → 引用第2行 ❌
第5行鄉根大樓ParentUuid = NULL ✓ (根節點)
```
### 解決方案
重新排序 SQL 檔案,根節點在前:
```
鄉根大樓 (根) → 三樓, 十樓 → 三樓男眾寮房, 十樓女眾寮房
```
---
## 問題 2連鎖外鍵錯誤
### 原因
自引用外鍵的表Region, followers因 INSERT 順序錯誤導致部分記錄插入失敗,
進而導致引用這些表的子表也出現外鍵錯誤。
### 為什麼源資料庫中這些資料能存在?
源資料庫可能:
1. 外鍵用 `WITH NOCHECK` 創建(不檢查現有資料)
2. 插入時暫時禁用外鍵約束
3. 導出時只導出部分資料(有過濾條件)
但我們的 schema 使用 `WITH CHECK`(嚴格模式),每筆 INSERT 都會驗證。
### 錯誤鏈
```
Region 部分記錄插入失敗 (自引用順序錯誤)
└→ Room 外鍵錯誤
└→ RegionRoomBed 外鍵錯誤
└→ GuaDanOrderGuest 外鍵錯誤
└→ RegionAndRoomAndBedSchedule 外鍵錯誤 (14筆)
followers 部分記錄插入失敗 (自引用順序錯誤)
└→ pro_order (~20筆), family_members, followers_tablet 外鍵錯誤
```
### 結論
**修正 Region 和 followers 的 INSERT 順序後,連鎖錯誤應會消失。**
### 解決方案
1. 修正自引用表的 INSERT 順序
2. 或在插入前禁用外鍵檢查,插入後再啟用
---
## 已解決UTF-8 編碼問題
`initdb.ps1` 已加上 `-f 65001` 參數
---
# 待辦工作清單
## 自引用外鍵表分析
| 表 | 自引用外鍵 | 資料狀況 | 需處理? |
|---|---|---|---|
| act_bom | package_num → num | 已按順序排列 | ❌ |
| AncestralTabletArea | ParentAreaId → AreaId | 空表 | ❌ |
| followers | leader → num | 1 筆錯誤 | ⚠️ 待查 |
| Region | ParentUuid → Uuid | 4 筆錯誤,順序錯誤 | ✅ 需重排 |
## 工作項目
- [ ] 重排 `exclude/dbo.Region.Table.sql` INSERT 順序
- [ ] 檢查 `exclude/dbo.followers.Table.sql` 中 leader 引用問題
- [ ] 重新測試初始化腳本