02|認識紡織範例資料庫
你要完成什麼
Section titled “你要完成什麼”看懂客戶 → 訂單 → 明細 → 出貨的關聯,並比較一般唯讀、業務與講師權限。全庫 27 張表、17,992 筆資料;資料是合成的。
| 範圍 | 範例 |
|---|---|
| 基本組織 | 12 部門、180 員工 |
| 商務 | 60 客戶、30 供應商、1,200 訂單、3,600 明細 |
| 產品與營運 | 48 布料、36 原料、24 機台、90 日產出 |
| 機密情境 | 薪資、產品成本、議價、染整配方、研發預算、董事會計畫 |
逐表字典 →。core.data_catalog 也存有部門、敏感等級與定義,目前還沒有 OpenMetadata 服務。
第一步:建表、造資料、套權限
Section titled “第一步:建表、造資料、套權限”先完成環境準備,在自己的獨立環境執行:
docker compose up -d postgrespython3 scripts/bootstrap.pypython3 scripts/verify.py查看檔案:db/schema.sql 定義結構,db/seed.sql 放合成資料,db/views_permissions.sql 定義角色權限、RLS 與儀表板 view。bootstrap.py 使用單一交易;已存在 core.lab_config 時拒絕覆寫。
第二步:用 pgAdmin 看資料
Section titled “第二步:用 pgAdmin 看資料”第三章啟動網頁服務後,開資料表介面。講師登入後展開「青梭紡織|虛構教學資料」→「一般唯讀」→ textile → Schemas → sales → Tables → orders → View/Edit Data。
網頁登入密碼與 PostgreSQL 角色密碼不同;不把講師管理密碼交給 Agent。初次連線需由講師填該角色密碼。
SELECT current_user, session_user;SELECT COUNT(*) FROM sales.orders;SELECT * FROM core.data_catalog ORDER BY schema_name, table_name;core.data_catalog 的 schema_name 與 table_name 是複合主鍵;原始碼包的 db/schema.sql 可查看完整定義。
第三步:比較角色
Section titled “第三步:比較角色”| 角色 | 訂單範圍 | 機密 |
|---|---|---|
textile_reader |
一般營運資料,全部 1,200 訂單 | 無 HR/finance/confidential |
textile_sales |
台灣市場,300 訂單 | 不可讀薪資與研發機密 |
textile_bao_sales |
OpenBao 臨時角色繼承的台灣業務範圍 | 僅查詢必要欄位,沒有客戶 email |
textile_grafana |
核准的摘要 view | 不可直接讀底層表 |
textile_admin |
講師管理 | 僅講師使用,不能當 Agent 帳號 |
RLS 不會替你遮罩所有欄位;表/欄位 grants 與 RLS 要一起驗證。管理員、表 owner 或 BYPASSRLS 角色可能繞過一般 RLS,所以測試一定要用真正的業務角色。
第四步:讀懂「逾期未完全出貨」
Section titled “第四步:讀懂「逾期未完全出貨」”承諾出貨日 < 2026-10-20且 訂單日期 <= 2026-10-20且 目前狀態不是 cancelled且 剩餘公尺數 > 0每一明細的剩餘量 = GREATEST(訂購量 − 截至基準日已出貨量, 0);先按明細彙總出貨,再 JOIN,最後加總成訂單。單位為公尺,不是訂單張數。完整實際 SQL 在驗收頁。
日期限制不代表完整歷史回放。 出貨有截止日條件,但訂單 status 是目前欄位;沒有 CDC 或歷史狀態表時,不能宣稱還原當年的訂單狀態。
verify.py 應通過 33 項資料/權限檢查。業務角色查薪資應拒絕;台灣市場之外的訂單不可見。不要只看超級使用者查詢成功。