# 04 資料字典

主要讀者：DBA、後端研發工程師、測試案例維護者與整合工程師。

```mermaid
flowchart LR
  C["Crystal 管理定義"] --> D["QA 專案、環境、Suite、Case、Step"]
  D --> P["Plan 選案與 Trigger 排程"]
  P --> N["Northstar 執行宿主"]
  S["Sentry 共用執行核心"] -. 提供執行邏輯 .-> N
  N --> R["Run → RunSuite → RunCase → RunStep"]
  R --> E["結果、比對明細、檔案產物"]
  E --> C
```

## 1 範圍與讀法

本字典涵蓋 E2E 測試平台 **17 張 QA 表、186 個持久映射欄位與 76 個基礎模型輔助欄位**，以及六種可執行步驟的 JSON 設定。資料表都位於 `qa` schema；下列分組是管理、執行與證據責任，不是額外建立的 schema。

- **型別**列 Java 映射與已知 SQL 轉型；不能直接把 Java `String` 當成 DB `varchar`。
- **歷史 DDL**保留舊建表規格的型別、Null 與 default。它不是現行環境完整 schema；當歷史 DDL 與現行模型不同時，兩者並列，不據此執行建表。
- **PK（映射）**表示物件識別鍵；**邏輯 FK**表示業務／JOIN 關聯。舊規格曾宣告的七組 FK 另註，是否已部署仍須查 DB catalog。
- **模型必填**表示 not-null 註記。沒有註記不等同 DB 允許 Null。「未核對」不等同不存在約束。
- JSON 物件欄位不是獨立資料表欄位，儲存層 PK/FK、Null、default、Unique／Check 不適用；其 API 檢核另列。
- 白天同仁操作與夜間測試共用同一套 EKS 環境及資料，沒有已實作的資料隔離保證。夜間固定強制關閉；須留下早上啟動後可查的線索，實際持久化仍待環境驗證。

### 1-1 目錄

- [2 定義與排程](#definitions)
- [3 執行結果](#execution)
- [4 比對、產物與選單](#evidence)
- [5 六種步驟 JSON](#step-json)
- [6 組合規則與模型差異](#constraints)
- [7 View 與驗證邊界](#views)

ERD、索引、資料責任與並行控制見 [03 資料模型與儲存](04_DATA_MODEL_AND_STORAGE.md)。API 請求與回應以 [openapi.yaml](openapi.yaml) 為準。

<a id="definitions"></a>

## 2 定義與排程

### 2-1 `qa.qa_c001`：專案

| SQL 欄位／物件欄位 | 中文業務說明 | 現行映射型別 | PK/FK | Null | Default | Unique／Check／業務限制 |
| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
| `project_num`／`projectNum` | 專案ID | `Long`；歷史 `bigserial` | PK（映射） | 模型必填；部署待核對；歷史不可空 | 歷史：sequence 自增；部署待核對 | 歷史有 PK |
| `create_at`／`createAt` | 建立時間 | `String`；SQL `::timestamptz`；歷史 `timestamptz` | — | 模型必填；部署待核對；歷史不可空 | 歷史：now()；部署待核對 | Unique／Check 未核對 |
| `create_by`／`createBy` | 建立人員 | `Long`；歷史 `bigint` | — | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `update_at`／`updateAt` | 異動時間 | `String`；SQL `::timestamptz`；歷史 `timestamptz` | — | 模型未標示；部署待核對；歷史可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `update_by`／`updateBy` | 異動人員 | `Long`；歷史 `bigint` | — | 模型未標示；部署待核對；歷史可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `com_num`／`comNum` | 公司ID | `Long`；歷史 `bigint` | — | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `project_name`／`projectName` | 專案名稱 | `String`；歷史 `varchar` | — | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `project_code`／`projectCode` | 專案縮寫 | `String`；歷史 `varchar` | — | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `project_desc`／`projectDesc` | 描述 | `String`；歷史 `varchar` | — | 模型未標示；部署待核對；歷史可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |

基礎模型輔助欄位（未列入此表 SQL 基礎欄位；儲存限制均不適用）：

| 物件欄位 | 中文說明 | Java 型別 |
| :--- | :--- | :--- |
| `createByName` | 建立人員名稱 | `String` |
| `updateByName` | 更新人員名稱 | `String` |
| `comId` | 公司編碼 | `String` |

### 2-2 `qa.qa_c002`：測試環境

| SQL 欄位／物件欄位 | 中文業務說明 | 現行映射型別 | PK/FK | Null | Default | Unique／Check／業務限制 |
| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
| `env_num`／`envNum` | 環境ID | `Long`；歷史 `bigserial` | PK（映射） | 模型必填；部署待核對；歷史不可空 | 歷史：sequence 自增；部署待核對 | 歷史有 PK |
| `create_at`／`createAt` | 建立時間 | `String`；SQL `::timestamptz`；歷史 `timestamptz` | — | 模型必填；部署待核對；歷史不可空 | 歷史：now()；部署待核對 | Unique／Check 未核對 |
| `create_by`／`createBy` | 建立人員 | `Long`；歷史 `bigint` | — | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `update_at`／`updateAt` | 異動時間 | `String`；SQL `::timestamp`；歷史 `timestamptz` | — | 模型未標示；部署待核對；歷史可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `update_by`／`updateBy` | 異動人員 | `Long`；歷史 `bigint` | — | 模型未標示；部署待核對；歷史可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `project_num`／`projectNum` | 專案ID | `Long`；歷史 `bigint` | 邏輯 FK → qa_c001.project_num；歷史有 FK 宣告 | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `env_name`／`envName` | 名稱 | `String`；歷史 `varchar` | — | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `env_desc`／`envDesc` | 描述 | `String`；歷史 `varchar` | — | 模型未標示；部署待核對；歷史可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |

基礎模型輔助欄位（未列入此表 SQL 基礎欄位；儲存限制均不適用）：

| 物件欄位 | 中文說明 | Java 型別 |
| :--- | :--- | :--- |
| `createByName` | 建立人員名稱 | `String` |
| `updateByName` | 更新人員名稱 | `String` |
| `comId` | 公司編碼 | `String` |
| `comNum` | 公司流水號 | `Long` |

### 2-3 `qa.qa_c003`：測試群組 Suite

| SQL 欄位／物件欄位 | 中文業務說明 | 現行映射型別 | PK/FK | Null | Default | Unique／Check／業務限制 |
| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
| `suite_num`／`suiteNum` | 測試群組ID | `Long`；歷史 `bigserial` | PK（映射） | 模型必填；部署待核對；歷史不可空 | 歷史：sequence 自增；部署待核對 | 歷史有 PK |
| `create_at`／`createAt` | 建立時間 | `String`；SQL `::timestamptz`；歷史 `timestamptz` | — | 模型必填；部署待核對；歷史不可空 | 歷史：now()；部署待核對 | Unique／Check 未核對 |
| `create_by`／`createBy` | 建立人員 | `Long`；歷史 `bigint` | — | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `update_at`／`updateAt` | 異動時間 | `String`；SQL `::timestamp`；歷史 `timestamptz` | — | 模型未標示；部署待核對；歷史可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `update_by`／`updateBy` | 異動人員 | `Long`；歷史 `bigint` | — | 模型未標示；部署待核對；歷史可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `project_num`／`projectNum` | 專案ID | `Long`；歷史 `bigint` | 邏輯 FK → qa_c001.project_num；歷史有 FK 宣告 | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `parent_num`／`parentNum` | 上層案例群組,根為0, 可巢狀 | `Long`；歷史 `bigint` | 邏輯 FK → qa_c003.suite_num | 模型未標示；部署待核對；歷史可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `suite_name`／`suiteName` | 案例群組名稱 | `String`；歷史 `varchar` | — | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `suite_desc`／`suiteDesc` | 案例群組描述 | `String`；歷史 `varchar` | — | 模型未標示；部署待核對；歷史可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `suite_order`／`suiteOrder` | 順序 | `Integer`；歷史 `int` | — | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `category`／`category` | 測試類別:1.PLATFORM,2.JUNIT | `String` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |

基礎模型輔助欄位（未列入此表 SQL 基礎欄位；儲存限制均不適用）：

| 物件欄位 | 中文說明 | Java 型別 |
| :--- | :--- | :--- |
| `createByName` | 建立人員名稱 | `String` |
| `updateByName` | 更新人員名稱 | `String` |
| `comId` | 公司編碼 | `String` |
| `comNum` | 公司流水號 | `Long` |

### 2-4 `qa.qa_c004`：測試案例 Case

| SQL 欄位／物件欄位 | 中文業務說明 | 現行映射型別 | PK/FK | Null | Default | Unique／Check／業務限制 |
| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
| `case_num`／`caseNum` | 測試案例ID | `Long`；歷史 `bigserial` | PK（映射） | 模型必填；部署待核對；歷史不可空 | 歷史：sequence 自增；部署待核對 | 歷史有 PK |
| `create_at`／`createAt` | 建立時間 | `String`；SQL `::timestamptz`；歷史 `timestamptz` | — | 模型必填；部署待核對；歷史不可空 | 歷史：now()；部署待核對 | Unique／Check 未核對 |
| `create_by`／`createBy` | 建立人員 | `Long`；歷史 `bigint` | — | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `update_at`／`updateAt` | 異動時間 | `String`；SQL `::timestamp`；歷史 `timestamptz` | — | 模型未標示；部署待核對；歷史可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `update_by`／`updateBy` | 異動人員 | `Long`；歷史 `bigint` | — | 模型未標示；部署待核對；歷史可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `suite_num`／`suiteNum` | 群組ID | `Long`；歷史 `bigint` | 邏輯 FK → qa_c003.suite_num；歷史有 FK 宣告 | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `case_name`／`caseName` | 案例名稱 | `String`；歷史 `varchar` | — | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `case_desc`／`caseDesc` | 案例描述 | `String`；歷史 `varchar` | — | 模型未標示；部署待核對；歷史可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `case_type`／`caseType` | 案例類型：1 NORMAL、2 BEFORE_ALL、3 BEFORE_EACH、4 AFTER_EACH、5 AFTER_ALL；hooks 由清單處理，未證實每類限一筆 | `String`；歷史 `int` | — | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `case_order`／`caseOrder` | 順序 | `Integer`；歷史 `int` | — | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `depends_on`／`dependsOn` | 前置案例 ID 陣列字串；現況只攔截查得的 FAILED，未限定本次 Run，不能保證所有前置皆成功 | `String`；歷史 `varchar` | — | 模型未標示；部署待核對；歷史可空 | 歷史：未宣告；部署待核對 | 案例 ID 陣列的字串；非獨立關聯表 |
| `is_deleted`／`isDeleted` | 軟刪除 | `Boolean`；歷史 `boolean` | — | 模型必填；部署待核對；歷史不可空 | 歷史：false；部署待核對 | Unique／Check 未核對 |
| `category`／`category` | 測試種類:1.PLATFORM,2.JUNIT | `String` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |

基礎模型輔助欄位（未列入此表 SQL 基礎欄位；儲存限制均不適用）：

| 物件欄位 | 中文說明 | Java 型別 |
| :--- | :--- | :--- |
| `createByName` | 建立人員名稱 | `String` |
| `updateByName` | 更新人員名稱 | `String` |
| `comId` | 公司編碼 | `String` |
| `comNum` | 公司流水號 | `Long` |

### 2-5 `qa.qa_c013`：案例步驟 Step

| SQL 欄位／物件欄位 | 中文業務說明 | 現行映射型別 | PK/FK | Null | Default | Unique／Check／業務限制 |
| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
| `step_num`／`stepNum` | 步驟流水號 | `Long` | PK（映射） | 模型必填；部署待核對 | 未取得；部署待核對 | 實體 PK 待核對 |
| `create_at`／`createAt` | 建立時間 | `String`；SQL `::timestamptz` | — | 模型必填；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `create_by`／`createBy` | 建立人 | `Long` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `update_at`／`updateAt` | 更新時間 | `String`；SQL `::timestamptz` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `update_by`／`updateBy` | 更新人 | `Long` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `case_num`／`caseNum` | 案例ID 關聯qa_c004 | `Long` | 邏輯 FK → qa_c004.case_num | 模型必填；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `step_order`／`stepOrder` | 步驟順序 | `Integer` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `step_type`／`stepType` | 步驟類型：1 HTTP、2 SQL_COMPARE、3 PRE_SQL、4 SQL_TRANSFER、6 INVOKE、7 SQL_SELECT_COMPARE；5 停用 | `String` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | 有效代碼 1、2、3、4、6、7；非 DB Check 證據 |
| `step_exec`／`stepExec` | 步驟執行內容 | `String`；SQL `::json` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `step_remark`／`stepRemark` | 步驟備註 | `String` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `step_name`／`stepName` | 步驟名稱 | `String` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |

基礎模型輔助欄位（未列入此表 SQL 基礎欄位；儲存限制均不適用）：

| 物件欄位 | 中文說明 | Java 型別 |
| :--- | :--- | :--- |
| `createByName` | 建立人員名稱 | `String` |
| `updateByName` | 更新人員名稱 | `String` |
| `comId` | 公司編碼 | `String` |
| `comNum` | 公司流水號 | `Long` |

### 2-6 `qa.qa_c005`：測試計畫 Plan

| SQL 欄位／物件欄位 | 中文業務說明 | 現行映射型別 | PK/FK | Null | Default | Unique／Check／業務限制 |
| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
| `plan_num`／`planNum` | 計畫ID | `Long`；歷史 `bigserial` | PK（映射） | 模型必填；部署待核對；歷史不可空 | 歷史：sequence 自增；部署待核對 | 歷史有 PK |
| `create_at`／`createAt` | 建立時間 | `String`；SQL `::timestamptz`；歷史 `timestamptz` | — | 模型必填；部署待核對；歷史不可空 | 歷史：now()；部署待核對 | Unique／Check 未核對 |
| `create_by`／`createBy` | 建立人員 | `Long`；歷史 `bigint` | — | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `update_at`／`updateAt` | 異動時間 | `String`；SQL `::timestamptz`；歷史 `timestamptz` | — | 模型未標示；部署待核對；歷史可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `update_by`／`updateBy` | 異動人員 | `Long`；歷史 `bigint` | — | 模型未標示；部署待核對；歷史可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `project_num`／`projectNum` | 專案ID | `Long`；歷史 `bigint` | 邏輯 FK → qa_c001.project_num；歷史有 FK 宣告 | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `plan_name`／`planName` | 名稱 | `String`；歷史 `varchar` | — | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `plan_desc`／`planDesc` | 描述 | `String`；歷史 `varchar` | — | 模型未標示；部署待核對；歷史可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |

基礎模型輔助欄位（未列入此表 SQL 基礎欄位；儲存限制均不適用）：

| 物件欄位 | 中文說明 | Java 型別 |
| :--- | :--- | :--- |
| `createByName` | 建立人員名稱 | `String` |
| `updateByName` | 更新人員名稱 | `String` |
| `comId` | 公司編碼 | `String` |
| `comNum` | 公司流水號 | `Long` |

### 2-7 `qa.qa_c006`：計畫案例集合

| SQL 欄位／物件欄位 | 中文業務說明 | 現行映射型別 | PK/FK | Null | Default | Unique／Check／業務限制 |
| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
| `case_plan_num`／`casePlanNum` | 集合ID | `Long`；歷史 `bigserial` | PK（映射） | 模型必填；部署待核對；歷史不可空 | 歷史：sequence 自增；部署待核對 | 歷史有 PK |
| `case_num`／`caseNum` | 案例ID | `Long`；歷史 `bigint` | 邏輯 FK → qa_c004.case_num；歷史有 FK 宣告 | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | 計畫＋案例為集合語意；未證實複合 Unique |
| `plan_num`／`planNum` | 計畫ID | `Long`；歷史 `bigint` | 邏輯 FK → qa_c005.plan_num；歷史有 FK 宣告 | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | 計畫＋案例為集合語意；未證實複合 Unique |

基礎模型輔助欄位（未列入此表 SQL 基礎欄位；儲存限制均不適用）：

| 物件欄位 | 中文說明 | Java 型別 |
| :--- | :--- | :--- |
| `createAt` | 建立時間 | `String` |
| `createBy` | 建立人員 | `Long` |
| `createByName` | 建立人員名稱 | `String` |
| `updateAt` | 更新時間 | `String` |
| `updateBy` | 更新人員 | `Long` |
| `updateByName` | 更新人員名稱 | `String` |
| `comId` | 公司編碼 | `String` |
| `comNum` | 公司流水號 | `Long` |

### 2-8 `qa.qa_c007`：排程觸發 Trigger

| SQL 欄位／物件欄位 | 中文業務說明 | 現行映射型別 | PK/FK | Null | Default | Unique／Check／業務限制 |
| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
| `trigger_num`／`triggerNum` | 計畫觸發ID | `Long`；歷史 `bigserial` | PK（映射） | 模型必填；部署待核對；歷史不可空 | 歷史：sequence 自增；部署待核對 | 歷史有 PK |
| `create_at`／`createAt` | 建立時間 | `String`；SQL `::timestamptz`；歷史 `timestamptz` | — | 模型必填；部署待核對；歷史不可空 | 歷史：now()；部署待核對 | Unique／Check 未核對 |
| `create_by`／`createBy` | 建立人員 | `Long`；歷史 `bigint` | — | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `update_at`／`updateAt` | 異動時間 | `String`；SQL `::timestamptz`；歷史 `timestamptz` | — | 模型未標示；部署待核對；歷史可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `update_by`／`updateBy` | 異動人員 | `Long`；歷史 `bigint` | — | 模型未標示；部署待核對；歷史可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `plan_num`／`planNum` | 測試計畫ID | `Long`；歷史 `bigint` | 邏輯 FK → qa_c005.plan_num；歷史有 FK 宣告 | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `env_num`／`envNum` | 環境ID | `Long`；歷史 `bigint` | 邏輯 FK → qa_c002.env_num | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `notice_group_code`／`noticeGroupCode` | 通知群組 | `String`；歷史 `varchar` | — | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `trigger_name`／`triggerName` | 觸發名稱 | `String`；歷史 `varchar` | — | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `trigger_desc`／`triggerDesc` | 描述 | `String`；歷史 `varchar` | — | 模型未標示；部署待核對；歷史可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `is_enabled`／`isEnabled` | 是否執行 | `Boolean`；歷史 `boolean` | — | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `is_included`／`isIncluded` | 是否寫入總表 | `Boolean`；歷史 `boolean` | — | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | 是否納入總表，不是寄信開關 |
| `cron`／`cron` | 定時 | `String`；歷史 `varchar` | — | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `next_run_time`／`nextRunTime` | 下次執行時間 | `String`；SQL `::timestamptz`；歷史 `timestamptz` | — | 模型未標示；部署待核對；歷史可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `last_run_time`／`lastRunTime` | 最後執行時間 | `String`；SQL `::timestamptz`；歷史 `timestamptz` | — | 模型未標示；部署待核對；歷史可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |

基礎模型輔助欄位（未列入此表 SQL 基礎欄位；儲存限制均不適用）：

| 物件欄位 | 中文說明 | Java 型別 |
| :--- | :--- | :--- |
| `createByName` | 建立人員名稱 | `String` |
| `updateByName` | 更新人員名稱 | `String` |
| `comId` | 公司編碼 | `String` |
| `comNum` | 公司流水號 | `Long` |

### 2-9 `qa.qa_c012`：環境設定

| SQL 欄位／物件欄位 | 中文業務說明 | 現行映射型別 | PK/FK | Null | Default | Unique／Check／業務限制 |
| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
| `config_num`／`configNum` | 變數設定ID | `Long`；歷史 `bigserial` | PK（映射） | 模型必填；部署待核對；歷史不可空 | 歷史：sequence 自增；部署待核對 | 歷史有 PK |
| `create_at`／`createAt` | 建立時間 | `String`；SQL `::timestamptz`；歷史 `timestamptz` | — | 模型必填；部署待核對；歷史不可空 | 歷史：now()；部署待核對 | Unique／Check 未核對 |
| `create_by`／`createBy` | 建立人員 | `Long`；歷史 `bigint` | — | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `update_at`／`updateAt` | 異動時間 | `String`；SQL `::timestamp`；歷史 `timestamptz` | — | 模型未標示；部署待核對；歷史可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `update_by`／`updateBy` | 異動人員 | `Long`；歷史 `bigint` | — | 模型未標示；部署待核對；歷史可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `env_num`／`envNum` | 環境ID | `Long`；歷史 `bigint` | 邏輯 FK → qa_c002.env_num | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | 環境＋鍵需一致；未證實複合 Unique |
| `config_key`／`configKey` | 名稱 | `String`；歷史 `varchar` | — | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | 環境＋鍵需一致；未證實複合 Unique |
| `config_value`／`configValue` | 值 | `String`；歷史 `varchar` | — | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | 可能含敏感設定；不得直接放入公開報告 |

基礎模型輔助欄位（未列入此表 SQL 基礎欄位；儲存限制均不適用）：

| 物件欄位 | 中文說明 | Java 型別 |
| :--- | :--- | :--- |
| `createByName` | 建立人員名稱 | `String` |
| `updateByName` | 更新人員名稱 | `String` |
| `comId` | 公司編碼 | `String` |
| `comNum` | 公司流水號 | `Long` |

<a id="execution"></a>

## 3 執行結果

### 3-1 `qa.qa_c008`：測試執行 Run

| SQL 欄位／物件欄位 | 中文業務說明 | 現行映射型別 | PK/FK | Null | Default | Unique／Check／業務限制 |
| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
| `run_num`／`runNum` | 執行 ID | `Long`；歷史 `bigserial` | PK（映射） | 模型必填；部署待核對；歷史不可空 | 歷史：sequence 自增；部署待核對 | 歷史有 PK |
| `create_at`／`createAt` | 建立時間 | `String`；SQL `::timestamptz`；歷史 `timestamptz` | — | 模型必填；部署待核對；歷史不可空 | 歷史：now()；部署待核對 | Unique／Check 未核對 |
| `create_by`／`createBy` | 建立人員 | `Long`；歷史 `bigint` | — | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `update_at`／`updateAt` | 異動時間 | `String`；SQL `::timestamptz`；歷史 `timestamptz` | — | 模型未標示；部署待核對；歷史可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `update_by`／`updateBy` | 異動人員 | `Long`；歷史 `bigint` | — | 模型未標示；部署待核對；歷史可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `project_num`／`projectNum` | 專案ID | `Long`；歷史 `bigint` | 邏輯 FK → qa_c001.project_num | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `run_name`／`runName` | 名稱 | `String`；歷史 `varchar` | — | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `run_desc`／`runDesc` | 描述 | `String`；歷史 `varchar` | — | 模型未標示；部署待核對；歷史可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `run_status`／`runStatus` | 執行狀態：1 建立、2 執行中、3 完成、4 中斷、5 待重試、6 忽略；完成不代表所有案例通過；強制關閉也可能殘留執行中，須隔日核對 | `String`；歷史 `int` | — | 模型必填；部署待核對；歷史不可空 | 歷史：1；部署待核對 | Unique／Check 未核對 |
| `trigger_num`／`triggerNum` | 計畫觸發ID | `Long`；歷史 `bigint` | 邏輯 FK → qa_c007.trigger_num | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `trigger_record`／`triggerRecord` | 計畫觸發 紀錄 | `String`；SQL `::json`；歷史 `json` | — | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | 本次設定記錄；非完整不可變版本 |
| `plan_num`／`planNum` | 測試計畫ID | `Long`；歷史 `bigint` | 邏輯 FK → qa_c005.plan_num | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `plan_record`／`planRecord` | 測試計畫 紀錄 | `String`；SQL `::json`；歷史 `json` | — | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | 本次設定記錄；非完整不可變版本 |
| `env_num`／`envNum` | 環境ID | `Long`；歷史 `bigint` | 邏輯 FK → qa_c002.env_num | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `env_record`／`envRecord` | 環境 紀錄 | `String`；SQL `::json`；歷史 `json` | — | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | 本次設定記錄；非完整不可變版本 |
| `is_included`／`isIncluded` | 是否寫入總表 | `Boolean`；歷史 `boolean` | — | 模型必填；部署待核對；歷史不可空 | 歷史：true；部署待核對 | Unique／Check 未核對 |
| `exclude_comment`／`excludeComment` | 不寫入總表原因 | `String`；歷史 `varchar` | — | 模型未標示；部署待核對；歷史可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `run_start_time`／`runStartTime` | 執行起始時間 | `String`；SQL `::timestamptz`；歷史 `timestamptz` | — | 模型未標示；部署待核對；歷史可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `run_end_time`／`runEndTime` | 執行結束時間 | `String`；SQL `::timestamptz`；歷史 `timestamptz` | — | 模型未標示；部署待核對；歷史可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `run_log`／`runLog` | 執行log | `String`；歷史 `varchar` | — | 模型未標示；部署待核對；歷史可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `retry_count`／`retryCount` | 重試次數欄位；欄位存在不代表目前會自動重跑 | `Integer` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `expected_suite_count`／`expectedSuiteCount` | 預期執行群組數 | `Integer` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `expected_case_count`／`expectedCaseCount` | 預期執行案例數 | `Integer` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `pipeline_info`／`pipelineInfo` | CI pipeline 資訊 | `String` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |

基礎模型輔助欄位（未列入此表 SQL 基礎欄位；儲存限制均不適用）：

| 物件欄位 | 中文說明 | Java 型別 |
| :--- | :--- | :--- |
| `createByName` | 建立人員名稱 | `String` |
| `updateByName` | 更新人員名稱 | `String` |
| `comId` | 公司編碼 | `String` |
| `comNum` | 公司流水號 | `Long` |

### 3-2 `qa.qa_c009`：群組執行結果

| SQL 欄位／物件欄位 | 中文業務說明 | 現行映射型別 | PK/FK | Null | Default | Unique／Check／業務限制 |
| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
| `run_suite_num`／`runSuiteNum` | 群組執行結果ID | `Long`；歷史 `bigserial` | PK（映射） | 模型必填；部署待核對；歷史不可空 | 歷史：sequence 自增；部署待核對 | 歷史有 PK |
| `create_at`／`createAt` | 建立時間 | `String`；SQL `::timestamptz`；歷史 `timestamptz` | — | 模型必填；部署待核對；歷史不可空 | 歷史：now()；部署待核對 | Unique／Check 未核對 |
| `create_by`／`createBy` | 建立人員 | `Long`；歷史 `bigint` | — | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `update_at`／`updateAt` | 異動時間 | `String`；SQL `::timestamptz`；歷史 `timestamptz` | — | 模型未標示；部署待核對；歷史可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `update_by`／`updateBy` | 異動人員 | `Long`；歷史 `bigint` | — | 模型未標示；部署待核對；歷史可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `run_num`／`runNum` | 執行ID | `Long`；歷史 `bigint` | 邏輯 FK → qa_c008.run_num | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `suite_num`／`suiteNum` | 案例群組ID | `Long`；歷史 `bigint` | 邏輯 FK → qa_c003.suite_num | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `suite_record`／`suiteRecord` | suite 原封不動 | `String`；SQL `::json`；歷史 `json` | — | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | 本次設定記錄；非完整不可變版本 |
| `suite_status`／`suiteStatus` | 群組執行狀態：1 建立、2 執行中、3 通過、4 失敗、5 執行異常、6 相依失敗 | `String` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | 欄位存在；新增 RunSuite 路徑未填此欄 |

基礎模型輔助欄位（未列入此表 SQL 基礎欄位；儲存限制均不適用）：

| 物件欄位 | 中文說明 | Java 型別 |
| :--- | :--- | :--- |
| `createByName` | 建立人員名稱 | `String` |
| `updateByName` | 更新人員名稱 | `String` |
| `comId` | 公司編碼 | `String` |
| `comNum` | 公司流水號 | `Long` |

### 3-3 `qa.qa_c010`：案例執行結果

| SQL 欄位／物件欄位 | 中文業務說明 | 現行映射型別 | PK/FK | Null | Default | Unique／Check／業務限制 |
| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
| `run_case_num`／`runCaseNum` | 案例執行結果ID | `Long`；歷史 `bigserial` | PK（映射） | 模型必填；部署待核對；歷史不可空 | 歷史：sequence 自增；部署待核對 | 歷史有 PK |
| `create_at`／`createAt` | 建立時間 | `String`；SQL `::timestamptz`；歷史 `timestamptz` | — | 模型必填；部署待核對；歷史不可空 | 歷史：now()；部署待核對 | Unique／Check 未核對 |
| `create_by`／`createBy` | 建立人員 | `Long`；歷史 `bigint` | — | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `update_at`／`updateAt` | 異動時間 | `String`；SQL `::timestamptz`；歷史 `timestamptz` | — | 模型未標示；部署待核對；歷史可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `update_by`／`updateBy` | 異動人員 | `Long`；歷史 `bigint` | — | 模型未標示；部署待核對；歷史可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `run_suite_num`／`runSuiteNum` | 群組執行結果ID | `Long`；歷史 `bigint` | 邏輯 FK → qa_c009.run_suite_num | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `case_num`／`caseNum` | 案例ID | `Long`；歷史 `bigint` | 邏輯 FK → qa_c004.case_num | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `case_record`／`caseRecord` | case_record 原封不動 | `String`；SQL `::json`；歷史 `json` | — | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | 本次設定記錄；非完整不可變版本 |
| `case_status`／`caseStatus` | 當次案例狀態：0 未執行、1 建立、2 執行中、3 通過、4 失敗、5 執行錯誤、6 相依失敗、7 中止 | `String`；歷史 `int` | — | 模型未標示；部署待核對；歷史可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `case_start_time`／`caseStartTime` | 執行起始時間 | `String`；SQL `::timestamptz`；歷史 `timestamptz` | — | 模型未標示；部署待核對；歷史可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `case_end_time`／`caseEndTime` | 執行結束時間 | `String`；SQL `::timestamptz`；歷史 `timestamptz` | — | 模型未標示；部署待核對；歷史可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `case_throwable`／`caseThrowable` | 案例錯誤及異常紀錄 | `String` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | 欄位存在；例外路徑未保證填值 |

基礎模型輔助欄位（未列入此表 SQL 基礎欄位；儲存限制均不適用）：

| 物件欄位 | 中文說明 | Java 型別 |
| :--- | :--- | :--- |
| `createByName` | 建立人員名稱 | `String` |
| `updateByName` | 更新人員名稱 | `String` |
| `comId` | 公司編碼 | `String` |
| `comNum` | 公司流水號 | `Long` |

### 3-4 `qa.qa_c011`：步驟執行結果

| SQL 欄位／物件欄位 | 中文業務說明 | 現行映射型別 | PK/FK | Null | Default | Unique／Check／業務限制 |
| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
| `run_step_num`／`runStepNum` | 步驟執行結果ID | `Long`；歷史 `bigserial` | PK（映射） | 模型必填；部署待核對；歷史不可空 | 歷史：sequence 自增；部署待核對 | 歷史有 PK |
| `run_case_num`／`runCaseNum` | 案例執行結果ID | `Long`；歷史 `bigserial` | 邏輯 FK → qa_c010.run_case_num | 模型必填；部署待核對；歷史不可空 | 歷史：sequence 自增；部署待核對 | Unique／Check 未核對 |
| `step_order`／`stepOrder` | 步驟順序 | `Integer`；歷史 `int` | — | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `step_type`／`stepType` | 當次步驟類型：1 HTTP、2 SQL_COMPARE、3 PRE_SQL、4 SQL_TRANSFER、6 INVOKE、7 SQL_SELECT_COMPARE | `String`；歷史 `int` | — | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | 有效代碼 1、2、3、4、6、7；非 DB Check 證據 |
| `step_exec`／`stepExec` | 步驟 | `String`；SQL `::json`；歷史 `json` | — | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `step_status`／`stepStatus` | 當次步驟結果：1 通過、2 失敗、3 執行異常、4 未啟用 | `String`；歷史 `int` | — | 模型必填；部署待核對；歷史不可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `step_result`／`stepResult` | 回傳結果資料 | `String`；歷史 `json` | — | 模型未標示；部署待核對；歷史可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `step_error`／`stepError` | 執行錯誤訊息 | `String`；歷史 `varchar` | — | 模型未標示；部署待核對；歷史可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `step_start_time`／`stepStartTime` | 執行起始時間 | `String`；SQL `::timestamptz`；歷史 `timestamptz` | — | 模型未標示；部署待核對；歷史可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `step_end_time`／`stepEndTime` | 執行結束時間 | `String`；SQL `::timestamptz`；歷史 `timestamptz` | — | 模型未標示；部署待核對；歷史可空 | 歷史：未宣告；部署待核對 | Unique／Check 未核對 |
| `step_num`／`stepNum` | 步驟ID 關聯qa_c012 | `Long` | 邏輯 FK → qa_c013.step_num | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `post_proc_resp`／`postProcResp` | 後置處理結果 | `String` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `step_name`／`stepName` | 步驟名稱 | `String` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |

基礎模型輔助欄位（未列入此表 SQL 基礎欄位；儲存限制均不適用）：

| 物件欄位 | 中文說明 | Java 型別 |
| :--- | :--- | :--- |
| `createAt` | 建立時間 | `String` |
| `createBy` | 建立人員 | `Long` |
| `createByName` | 建立人員名稱 | `String` |
| `updateAt` | 更新時間 | `String` |
| `updateBy` | 更新人員 | `Long` |
| `updateByName` | 更新人員名稱 | `String` |
| `comId` | 公司編碼 | `String` |
| `comNum` | 公司流水號 | `Long` |

<a id="evidence"></a>

## 4 比對、產物與選單

### 4-1 `qa.qa_r001`：SQL 比對彙總

| SQL 欄位／物件欄位 | 中文業務說明 | 現行映射型別 | PK/FK | Null | Default | Unique／Check／業務限制 |
| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
| `compare_num`／`compareNum` | 比對流水號 | `Long` | PK（映射） | 模型必填；部署待核對 | 未取得；部署待核對 | 實體 PK 待核對 |
| `create_by`／`createBy` | 建立人 | `Long` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `create_at`／`createAt` | 建立時間 | `String`；SQL `::timestamptz` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `update_by`／`updateBy` | 更新人 | `Long` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `update_at`／`updateAt` | 更新時間 | `String`；SQL `::timestamptz` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `step_num`／`stepNum` | 步驟流水號 關聯qa_c013 | `Long` | 邏輯 FK → qa_c013.step_num | 模型必填；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `case_num`／`caseNum` | 案例流水號 關聯qa_c004 | `Long` | 邏輯 FK → qa_c004.case_num | 模型必填；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `run_num`／`runNum` | 執行run流水號 關聯qa_c008 | `Long` | 邏輯 FK → qa_c008.run_num | 模型必填；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `expect_table`／`expectTable` | 比對預期table | `String` | — | 模型必填；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `result_table`／`resultTable` | 實際結果table | `String` | — | 模型必填；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `compare_setting_json`／`compareSettingJson` | 比對設定快照 | `String`；SQL `::json` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `compare_total_count`／`compareTotalCount` | 比對總筆數 | `Long` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `compare_passed_count`／`comparePassedCount` | 比對通過筆數 | `Long` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `compare_failed_count`／`compareFailedCount` | 比對失敗筆數 | `Long` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |

基礎模型輔助欄位（未列入此表 SQL 基礎欄位；儲存限制均不適用）：

| 物件欄位 | 中文說明 | Java 型別 |
| :--- | :--- | :--- |
| `createByName` | 建立人員名稱 | `String` |
| `updateByName` | 更新人員名稱 | `String` |
| `comId` | 公司編碼 | `String` |
| `comNum` | 公司流水號 | `Long` |

### 4-2 `qa.qa_r002`：SQL 比對欄位明細

| SQL 欄位／物件欄位 | 中文業務說明 | 現行映射型別 | PK/FK | Null | Default | Unique／Check／業務限制 |
| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
| `compare_dtl_num`／`compareDtlNum` | 比對明細流水號 | `Long` | PK（映射） | 模型必填；部署待核對 | 未取得；部署待核對 | 實體 PK 待核對 |
| `create_by`／`createBy` | 建立人 | `Long` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `create_at`／`createAt` | 建立時間 | `String`；SQL `::timestamptz` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `update_by`／`updateBy` | 更新人 | `Long` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `update_at`／`updateAt` | 更新時間 | `String`；SQL `::timestamptz` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `compare_num`／`compareNum` | 比對流水號 | `Long` | 邏輯 FK → qa_r001.compare_num | 模型必填；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `column_name`／`columnName` | 欄位名稱 | `String` | — | 模型必填；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `expect_value`／`expectValue` | 期望值 | `String` | — | 模型必填；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `result_value`／`resultValue` | 結果值 | `String` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `result_type`／`resultType` | 比對結果 1. 成功 2. 失敗 3. 不需比對 | `String` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `column_desc`／`columnDesc` | 比對欄位中文說明 | `String` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `column_type`／`columnType` | 欄位類型 1: 一般比對欄位 2: join 使用欄位 3: pk欄位 / | `String` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `row_num`／`rowNum` | 第幾筆資料 | `Integer` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |

基礎模型輔助欄位（未列入此表 SQL 基礎欄位；儲存限制均不適用）：

| 物件欄位 | 中文說明 | Java 型別 |
| :--- | :--- | :--- |
| `createByName` | 建立人員名稱 | `String` |
| `updateByName` | 更新人員名稱 | `String` |
| `comId` | 公司編碼 | `String` |
| `comNum` | 公司流水號 | `Long` |

### 4-3 `qa.qa_u001`：執行產物檔案

| SQL 欄位／物件欄位 | 中文業務說明 | 現行映射型別 | PK/FK | Null | Default | Unique／Check／業務限制 |
| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
| `qa_file_num`／`qaFileNum` | 流水號 | `Long` | PK（映射） | 模型必填；部署待核對 | 未取得；部署待核對 | 實體 PK 待核對 |
| `create_at`／`createAt` | 建立時間 | `String`；SQL `::timestamptz` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `create_by`／`createBy` | 建立人員 | `Long` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `update_at`／`updateAt` | 異動日期 | `String`；SQL `::timestamptz` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `update_by`／`updateBy` | 異動人員 | `Long` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `source_num`／`sourceNum` | 來源流水號 | `Long` | source_type=1 時對應 qa_c008.run_num | 模型必填；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `source_type`／`sourceType` | 來源類型；1 為測試執行，source_num 實際對應 run_num | `String` | — | 模型必填；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `file_name`／`fileName` | 檔案名稱 | `String` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `remote_file_path`／`remoteFilePath` | 遠端檔案路徑 | `String` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `current_upload_num`／`currentUploadNum` | 舊上傳流水號欄位（模型註記預定移除） | `Long` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |

基礎模型輔助欄位（未列入此表 SQL 基礎欄位；儲存限制均不適用）：

| 物件欄位 | 中文說明 | Java 型別 |
| :--- | :--- | :--- |
| `createByName` | 建立人員名稱 | `String` |
| `updateByName` | 更新人員名稱 | `String` |
| `comId` | 公司編碼 | `String` |
| `comNum` | 公司流水號 | `Long` |

### 4-4 `qa.qa_z000`：方法呼叫類型選單

| SQL 欄位／物件欄位 | 中文業務說明 | 現行映射型別 | PK/FK | Null | Default | Unique／Check／業務限制 |
| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
| `class_name`／`className` | 類別名稱 | `String` | PK（映射） | 模型必填；部署待核對 | 未取得；部署待核對 | 實體 PK 待核對 |
| `create_at`／`createAt` | 建立時間 | `String`；SQL `::timestamptz` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `create_by`／`createBy` | 建立人 | `Long` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `update_at`／`updateAt` | 更新時間 | `String`；SQL `::timestamptz` | — | 模型未標示；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |
| `class_use_type`／`classUseType` | 類別運用類型: 1. 型別 2. 調用bean class | `String` | — | 模型必填；部署待核對 | 未取得；部署待核對 | Unique／Check 未核對 |

基礎模型輔助欄位（未列入此表 SQL 基礎欄位；儲存限制均不適用）：

| 物件欄位 | 中文說明 | Java 型別 |
| :--- | :--- | :--- |
| `createByName` | 建立人員名稱 | `String` |
| `updateBy` | 更新人員 | `Long` |
| `updateByName` | 更新人員名稱 | `String` |
| `comId` | 公司編碼 | `String` |
| `comNum` | 公司流水號 | `Long` |

<a id="step-json"></a>

## 5 六種步驟 JSON

`qa_c013.step_exec` 保存定義，`qa_c011.step_exec` 保存當次執行所取得的設定。下列 `stepExec` 在 API 中是物件，在資料模型中可序列化成 JSON 字串；不要把它送成雙重編碼的字串。`StepExecPo` 基底本身沒有設定欄位。

本節的「檢核」指目前管理端對物件型 `stepExec` 的欄位檢查；不等於完整 JSON Schema 型別驗證。實際執行器可能另有使用前提。通用預設：參考型別未初始化時是 null、Java `int` 是 0；這些不是 API 承諾的業務預設值。

### 5-1 步驟外層物件

| JSON 欄位 | Java 型別 | 中文說明 | 現況檢核／限制 |
| :--- | :--- | :--- | :--- |
| `stepName` | `String` | 步驟名稱 | 未見此欄專用必填檢查；依執行前提保存 |
| `stepNum` | `Long` | 步驟定義流水號；既有步驟修改時保留 | 未見此欄專用必填檢查；依執行前提保存 |
| `caseNum` | `Long` | 所屬案例流水號 | 未見此欄專用必填檢查；依執行前提保存 |
| `stepType` | `String` | 決定 stepExec 子型別的代碼 | 未見此欄專用必填檢查；依執行前提保存 |
| `stepExec` | `StepExecPo` | 該型別的執行設定物件 | 未見此欄專用必填檢查；依執行前提保存 |
| `stepOrder` | `Integer` | 案例內步驟排序 | 未見此欄專用必填檢查；依執行前提保存 |
| `stepRemark` | `String` | 步驟備註；新增路徑未完整支援 | 未見此欄專用必填檢查；依執行前提保存 |

### 5-2 1 HTTP：呼叫 API

| JSON 欄位 | Java 型別 | 中文說明 | 現況檢核／限制 |
| :--- | :--- | :--- | :--- |
| `qaSource` | `String` | 測試資料來源代碼：main、log、dsb、fas | 未見此欄專用必填檢查；依執行前提保存；空值或不認識的代碼會回退 main 測試資料來源 |
| `method` | `String` | HTTP 方法 | 有傳入該物件時，欄位不可缺／不可空 |
| `url` | `String` | 受測 API URL，可包含執行變數 | 有傳入該物件時，欄位不可缺／不可空 |
| `input` | `HttpRequestPo` | HTTP 請求設定 | 執行器直接讀取 input 及 params／headers；無資料時也應提供空物件集合 |
| `output` | `HttpResponsePo` | 模型保留的回應設定；目前 handler 未把它當作斷言來源 | 不是實際 Run 結果；不是本 handler 使用的斷言設定 |
| `postProcPos` | `List<HttpPostProcPo>` | 後處理設定陣列 | 未見此欄專用必填檢查；依執行前提保存 |

### 5-3 2 SQL_COMPARE：比對資料表

| JSON 欄位 | Java 型別 | 中文說明 | 現況檢核／限制 |
| :--- | :--- | :--- | :--- |
| `qaSource` | `String` | 測試資料來源代碼：main、log、dsb、fas | 有傳入該物件時，欄位不可缺／不可空；空值或不認識的代碼會回退 main 測試資料來源 |
| `schema` | `String` | 要比對的資料庫 schema | 有傳入該物件時，欄位不可缺／不可空 |
| `table` | `String` | 實際結果表名；預期表使用同名加 _qa | 有傳入該物件時，欄位不可缺／不可空 |
| `columns` | `List<String>` | 舊欄位清單；現行比對 handler 取 columnInfoList | 未見此欄專用必填檢查；依執行前提保存 |
| `columnInfoList` | `List<Column>` | 比對欄位名稱與說明清單 | 管理檢核未強制非空；執行器會直接讀取，須提供有效欄位 |
| `whereCond` | `String` | 比對查詢的篩選條件 | 有傳入該物件時，欄位不可缺／不可空 |
| `joinMode` | `String` | 配對方式：1 LEFT、2 RIGHT、3 FULL、其他 INNER | 有傳入該物件時，欄位不可缺／不可空 |
| `joinOnCond` | `String` | 預期與實際資料的 JOIN 條件 | 省略時取表 PK 欄位；若表無 PK 又未指定條件則失敗 |

### 5-4 3 PRE_SQL：執行 SQL

| JSON 欄位 | Java 型別 | 中文說明 | 現況檢核／限制 |
| :--- | :--- | :--- | :--- |
| `qaSource` | `String` | 測試資料來源代碼：main、log、dsb、fas | 有傳入該物件時，欄位不可缺／不可空；空值或不認識的代碼會回退 main 測試資料來源 |
| `sqlScript` | `String` | 待執行 SQL 文字 | 有傳入該物件時，欄位不可缺／不可空 |
| `logEnabled` | `String` | 是否記錄 SQL 結果；Y 才啟用 | 未見此欄專用必填檢查；依執行前提保存 |
| `resultToVarPos` | `List<ResultToVarPo>` | SELECT 結果轉成執行變數的規則 | 未見此欄專用必填檢查；依執行前提保存 |

### 5-5 4 SQL_TRANSFER：匯入資料

| JSON 欄位 | Java 型別 | 中文說明 | 現況檢核／限制 |
| :--- | :--- | :--- | :--- |
| `qaSource` | `String` | 測試資料來源代碼：main、log、dsb、fas | 有傳入該物件時，欄位不可缺／不可空；空值或不認識的代碼會回退 main 測試資料來源 |
| `mode` | `Integer` | 匯入模式：1 清空後匯入，2 追加匯入 | 1 會先清空目標；2 追加；不認識的模式不應提交 |
| `source` | `String` | 來源資料表（schema.table）；使用 _in 測試基準資料 | 有傳入該物件時，欄位不可缺／不可空 |
| `target` | `String` | 目標資料表（schema.table） | 有傳入該物件時，欄位不可缺／不可空 |

### 5-6 6 INVOKE：呼叫程式方法

| JSON 欄位 | Java 型別 | 中文說明 | 現況檢核／限制 |
| :--- | :--- | :--- | :--- |
| `qaSource` | `String` | 測試資料來源代碼：main、log、dsb、fas | 未見此欄專用必填檢查；依執行前提保存；空值或不認識的代碼會回退 main 測試資料來源 |
| `systemName` | `String` | 受測系統代碼 | 有傳入該物件時，欄位不可缺／不可空 |
| `className` | `String` | 欲呼叫的類別識別 | 有傳入該物件時，欄位不可缺／不可空 |
| `beanName` | `String` | 欲呼叫的 Spring Bean 名稱 | 未見此欄專用必填檢查；依執行前提保存 |
| `methodName` | `String` | 欲呼叫的方法名稱 | 有傳入該物件時，欄位不可缺／不可空 |
| `args` | `List<InvokeArgPo>` | 帶型別的呼叫參數清單 | 未見此欄專用必填檢查；依執行前提保存 |
| `postProcPos` | `List<InvokePostProcPo>` | 後處理設定陣列 | 未見此欄專用必填檢查；依執行前提保存 |

### 5-7 7 SQL_SELECT_COMPARE：比對兩段 SQL

| JSON 欄位 | Java 型別 | 中文說明 | 現況檢核／限制 |
| :--- | :--- | :--- | :--- |
| `qaSource` | `String` | 測試資料來源代碼：main、log、dsb、fas | 有傳入該物件時，欄位不可缺／不可空；空值或不認識的代碼會回退 main 測試資料來源 |
| `expectedSqlScript` | `String` | 取得預期結果的 SQL | 有傳入該物件時，欄位不可缺／不可空 |
| `resultSqlScript` | `String` | 取得實際結果的 SQL | 有傳入該物件時，欄位不可缺／不可空 |
| `columnInfoList` | `List<Column>` | 比對欄位名稱與說明清單 | 管理檢核未強制非空；執行器會直接讀取，須提供有效欄位 |
| `whereCond` | `String` | 比對查詢的篩選條件 | 未見此欄專用必填檢查；依執行前提保存 |
| `joinMode` | `String` | 配對方式：1 LEFT、2 RIGHT、3 FULL、其他 INNER | 有傳入該物件時，欄位不可缺／不可空 |
| `joinOnCond` | `String` | 預期與實際資料的 JOIN 條件 | 有傳入該物件時，欄位不可缺／不可空 |

### 5-8 HTTP input

| JSON 欄位 | Java 型別 | 中文說明 | 現況檢核／限制 |
| :--- | :--- | :--- | :--- |
| `params` | `Map<String, String>` | URL 查詢參數鍵值集合 | 未見此欄專用必填檢查；依執行前提保存 |
| `headers` | `Map<String, String>` | HTTP Header 鍵值集合 | 未見此欄專用必填檢查；依執行前提保存 |
| `body` | `String` | HTTP／型別化參數的內容 | 未見此欄專用必填檢查；依執行前提保存 |

### 5-9 HTTP output（保留模型）

| JSON 欄位 | Java 型別 | 中文說明 | 現況檢核／限制 |
| :--- | :--- | :--- | :--- |
| `status` | `int` | 模型保留的 HTTP 狀態碼 | 未見此欄專用必填檢查；依執行前提保存 |
| `body` | `Map<String, Object>` | 模型保留的回應 JSON 物件 | 未見此欄專用必填檢查；依執行前提保存 |
| `headers` | `Map<String, String>` | HTTP Header 鍵值集合 | 未見此欄專用必填檢查；依執行前提保存 |

### 5-10 比對欄位項目

| JSON 欄位 | Java 型別 | 中文說明 | 現況檢核／限制 |
| :--- | :--- | :--- | :--- |
| `columnName` | `String` | 比對欄位名稱 | 有傳入該物件時，欄位不可缺／不可空 |
| `columnDesc` | `String` | 比對欄位中文說明 | 未見此欄專用必填檢查；依執行前提保存 |

### 5-11 SQL 結果轉變數項目

| JSON 欄位 | Java 型別 | 中文說明 | 現況檢核／限制 |
| :--- | :--- | :--- | :--- |
| `varKey` | `String` | 要建立的變數名稱 | 有傳入該物件時，欄位不可缺／不可空 |
| `varScope` | `int` | 變數範圍：1 GLOBAL、2 ENV、3 RUN、4 CASE | 有傳入該物件時，欄位不可缺／不可空 |
| `jsonPath` | `String` | 從 SQL 查詢結果提取值的 JSONPath | 有傳入該物件時，欄位不可缺／不可空 |

### 5-12 INVOKE 參數項目

| JSON 欄位 | Java 型別 | 中文說明 | 現況檢核／限制 |
| :--- | :--- | :--- | :--- |
| `type` | `String` | 型別識別字串 | 有傳入該物件時，欄位不可缺／不可空 |
| `body` | `String` | 帶型別參數的序列化內容；支援執行變數與特定 SELECT 取值 | 有傳入該物件時，欄位不可缺／不可空 |

### 5-13 HTTP 後處理共通欄位

| JSON 欄位 | Java 型別 | 中文說明 | 現況檢核／限制 |
| :--- | :--- | :--- | :--- |
| `name` | `String` | 後處理名稱 | 未見此欄專用必填檢查；依執行前提保存 |
| `targetObject` | `String` | 1 HTTP 狀態碼斷言、2 JSON 斷言；3 等待停用 | 有傳入該物件時，欄位不可缺／不可空 |
| `order` | `Integer` | 後處理順序欄位；執行器依收到的陣列順序處理 | 有傳入該物件時，欄位不可缺／不可空 |
| `enabled` | `String` | 是否啟用；Y 才執行，其他值標示未啟用 | 有傳入該物件時，欄位不可缺／不可空 |

### 5-14 HTTP 狀態碼斷言：targetObject=1

另外繼承 HTTP 後處理共通欄位。

| JSON 欄位 | Java 型別 | 中文說明 | 現況檢核／限制 |
| :--- | :--- | :--- | :--- |
| `expected` | `int` | 預期值 | 不可缺；0 表示非 4xx／5xx 即通過，不是 HTTP 0 |

### 5-15 HTTP JSON 斷言：targetObject=2

另外繼承 HTTP 後處理共通欄位。

| JSON 欄位 | Java 型別 | 中文說明 | 現況檢核／限制 |
| :--- | :--- | :--- | :--- |
| `expression` | `String` | 以 $ 開頭的 JSONPath | 不可空，且須以 $ 開頭 |
| `assertion` | `String` | 斷言方式 | 管理檢核只接受 equals |
| `expected` | `String` | 預期值 | 有傳入該物件時，欄位不可缺／不可空 |

### 5-16 HTTP 等待舊模型：targetObject=3

另外繼承 HTTP 後處理共通欄位。

| JSON 欄位 | Java 型別 | 中文說明 | 現況檢核／限制 |
| :--- | :--- | :--- | :--- |
| `waitMs` | `int` | 等待毫秒；僅保留舊模型，等待處理目前停用 | 模型存在，但執行 enum／處理分支停用；不列為可新增選項 |

### 5-17 INVOKE 後處理共通欄位

| JSON 欄位 | Java 型別 | 中文說明 | 現況檢核／限制 |
| :--- | :--- | :--- | :--- |
| `name` | `String` | 後處理名稱 | 未見此欄專用必填檢查；依執行前提保存 |
| `targetObject` | `String` | 1 回傳物件斷言、2 例外斷言；3 等待停用 | 有傳入該物件時，欄位不可缺／不可空 |
| `order` | `Integer` | 後處理順序欄位；執行器依收到的陣列順序處理 | 有傳入該物件時，欄位不可缺／不可空 |
| `enabled` | `String` | 是否啟用；Y 才執行，其他值標示未啟用 | 有傳入該物件時，欄位不可缺／不可空 |

### 5-18 INVOKE 回傳值斷言：targetObject=1

另外繼承 INVOKE 後處理共通欄位。

| JSON 欄位 | Java 型別 | 中文說明 | 現況檢核／限制 |
| :--- | :--- | :--- | :--- |
| `type` | `String` | 型別識別字串 | 有傳入該物件時，欄位不可缺／不可空 |
| `body` | `String` | 預期回傳物件的序列化內容 | 未見此欄專用必填檢查；依執行前提保存 |

### 5-19 INVOKE 例外斷言：targetObject=2

另外繼承 INVOKE 後處理共通欄位。

| JSON 欄位 | Java 型別 | 中文說明 | 現況檢核／限制 |
| :--- | :--- | :--- | :--- |
| `type` | `String` | 預期例外類型 | 有傳入該物件時，欄位不可缺／不可空 |
| `assertion` | `String` | 斷言方式 | 有傳入該物件時，欄位不可缺／不可空 |
| `message` | `String` | 預期例外訊息 | 未見此欄專用必填檢查；依執行前提保存 |

### 5-20 INVOKE 等待舊模型：targetObject=3

另外繼承 INVOKE 後處理共通欄位。

| JSON 欄位 | Java 型別 | 中文說明 | 現況檢核／限制 |
| :--- | :--- | :--- | :--- |
| `waitMs` | `int` | 等待毫秒；僅保留舊模型，等待處理目前停用 | 模型存在，但執行 enum／處理分支停用；不列為可新增選項 |

### 5-21 讀寫相容性

| 項目 | 現況 | 維護原則 |
| :--- | :--- | :--- |
| 步驟代碼 | 執行 enum 與 handler 支援 1、2、3、4、6、7 | 新增選單使用這六種；不得沿用舊註解將 2／3 交換 |
| 型別 5 | 備份設定模型還在，執行 enum 停用 | 舊資料應標示不支援，不提供新增 |
| 型別 7 | 執行端可轉換，CaseStep API 多型宣告未列入 7 | 讀寫 round-trip 需驗收，不能把 handler 存在當作維護 API 已驗證 |
| 未知欄位 | 執行型別 mapper 會忽略不認識的欄位 | 無法完整理解的設定保持唯讀，不能承諾原樣保存 |
| HTTP output | DTO 有欄位，handler 斷言看 postProcPos | 編輯時保留既有值，實際結果另查 RunStep |
| 步驟備註 | 修改路徑可保存，新增分支未完整支援 | 不將新增表單填寫成功當作已儲存成功 |
| PRE_SQL | 依 stepOrder 執行，並非自動在案例前執行 | 若用來準備後續步驟資料，明確排在前面 |
| SQL_COMPARE／SQL_SELECT_COMPARE | 以欄位配對後比對，無任何資料時回傳 error | 空集合不可當成全部通過 |
| 變數優先度 | CASE(4) > RUN(3) > ENV(2) > GLOBAL(1) | 名稱相同時取較高優先度；不等於資料庫隔離 |

<a id="constraints"></a>

## 6 組合規則與模型差異

### 6-1 必須整組解讀的識別與約束

| 組合 | 現況語意 | 約束與驗證限制 |
| :--- | :--- | :--- |
| `(plan_num, case_num)` | 某案例被納入某計畫 | `case_plan_num` 才是映射 PK；未證實組合 Unique，不可自行宣稱存在 |
| `(env_num, config_key)` | 同環境設定鍵 | `config_num` 是映射 PK；需核對重複鍵處理及實體 Unique |
| `(suite_num, case_order)`／`(case_num, step_order)` | 顯示與執行排序 | 未證實唯一約束；重複排序值的決定性須驗收 |
| `(run_num, run_suite_num, run_case_num, run_step_num)` | 執行結果的階層識別 | 由各層單欄流水號與邏輯關聯串起，不是四欄複合 PK |
| `(runNum, caseNum)` | 查某案例的本次執行範圍 | hooks 可在同一 Run 多次執行，不能設成結果唯一鍵 |
| `(source_type, source_num)` | 產物來源 | 現有檔案查詢只傳 source_num；跨來源類型混用前須確認碰撞風險 |
| `depends_on` + 本次 Run | 前置案例的成功條件 | 現況只檢查查得的 FAILED，且結果查詢未限定目前 Run／RunSuite；ERROR／未執行不等同已被阻擋 |

### 6-2 歷史建表與現行模型

| 差異 | 正確解讀 |
| :--- | :--- |
| 舊 Case 註解的 after hook 代碼及每類只能一筆 | 現行 enum 為 4 AFTER_EACH、5 AFTER_ALL；執行以清單處理，不沿用舊註解作唯一限制 |
| 早期 Case 有 `case_steps`，現行映射沒有 | 現行 Step 定義在 `qa_c013`；不能依舊 DDL 把步驟再塞回 Case 欄位 |
| 舊 `step_type`、`case_type`、狀態為 int，現行 Java 多為 String | API 按目前字串代碼；DB 實體型別須另查，不能直接用 Java 型別重建 DB |
| 舊 RunStep 的 `run_case_num` 宣告為 bigserial | 目前寫入會帶入已建立的 RunCase ID；不能利用該舊預設另造不相干的 RunCase ID |
| 現行新增 `category`、`suite_status`、`case_throwable`、`post_proc_resp` 等 | 這些欄位不在早期完整建表區段；目前部署定義待核對 |
| 舊規格末尾七組 FK 宣告位於延後處理區段 | 只有宣告證據，沒有套用證明；不能聲稱現場已具物理 FK |
| suite_record／case_record／step_exec | 分別在執行時取得；不是一次原子固定全部定義 |

### 6-3 強制關閉後的資料解讀

夜間固定強制關閉不等同 Run 已寫入完成或中斷終態。以下沿用現有欄位，不新增未實作的 shutdown／snapshot 欄位。

| 既有欄位 | 隔日追查用途 | 解讀限制 |
| :--- | :--- | :--- |
| run_num、trigger_num、plan_num、env_num | 找出前一夜哪次測試、計畫與環境 | 必須能在關閉後持久讀取，不能只留在執行器記憶體 |
| run_status、run_start_time、run_end_time | 判斷最後收到的狀態與起訖時間 | run_status=2 或結束時間空白可能是強制關閉前未回寫；不能自動當通過 |
| run_suite_num、run_case_num、run_step_num | 定位最後執行的群組、案例與步驟 | 未建立的結果可能沒有資料列，不以缺筆表示成功 |
| step_error、step_result、post_proc_resp、run_log | 查錯誤、實際回應與執行線索 | 持續寫入；不能等正常完成才一次保存，也不能假設每欄都已填值 |
| qa_u001.source_num／source_type、file_name、remote_file_path | 對回本次 Run 的已產生檔案 | 路徑及 metadata 不保證檔案內容已離開短生命週期儲存 |

日誌、結果與產物在強制關閉後仍可查，是目標驗收條件；實際資料庫持久性、外部日誌與產物儲存部署尚未驗證。早上對照最後回報與關閉事件後整理未完成 Run，保存中斷及修正線索；重跑另建 Run，不覆蓋舊結果。完整保存要求見 [03 資料模型與儲存](04_DATA_MODEL_AND_STORAGE.md)。

<a id="views"></a>

## 7 View 與驗證邊界

本範圍未找到平台專用持久 View 的定義。案例樹、執行報表與統計由 JOIN、聚合及物件轉換產生，不能替它們捏造 View 名稱或儲存約束。

| 查詢／投影 | 來源與推導 | 儲存限制 |
| :--- | :--- | :--- |
| Plan 的 `selectedCaseNums` | 由計畫案例集合中的 caseNum 衍生 | API 投影，非 DB 欄位，PK/FK／default／Check 不適用 |
| Case 的 `caseSteps` | `qa_c013.case_num` 對應 Case，按 step_order 取得 | API 集合，非 Case 表 JSON 欄位 |
| 單次 Run 通過率 | 已載入 NORMAL RunCase 的 PASSED 數／一般案例數，先將比例四捨五入兩位再乘 100 | 計算值，零案例現況回傳 100；不是完整驗收通過證明 |
| SQL 比對 JSON 檔 | 當次 SQL 比對 handler 將步驟結果加入 `SqlCompareReport_<runNum>.json` | 檔案產物，非資料庫 View；同名檔案讀取後覆寫的並發行為待驗證 |

資料字典已覆蓋本範圍映射與 JSON 模型；實際資料庫型別／Null／default／約束、既有案例內容、歷史資料與 round-trip 仍須在測試環境驗證。唯讀 catalog 查詢見 [03 資料模型與儲存](04_DATA_MODEL_AND_STORAGE.md)。
