跳到內容

02|認識紡織範例資料庫

看懂客戶 → 訂單 → 明細 → 出貨的關聯,並比較一般唯讀、業務與講師權限。全庫 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 postgres
python3 scripts/bootstrap.py
python3 scripts/verify.py

查看檔案:db/schema.sql 定義結構,db/seed.sql 放合成資料,db/views_permissions.sql 定義角色權限、RLS 與儀表板 view。bootstrap.py 使用單一交易;已存在 core.lab_config 時拒絕覆寫。

第三章啟動網頁服務後,開資料表介面。講師登入後展開「青梭紡織|虛構教學資料」→「一般唯讀」→ 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 可查看完整定義。

角色 訂單範圍 機密
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 項資料/權限檢查。業務角色查薪資應拒絕;台灣市場之外的訂單不可見。不要只看超級使用者查詢成功。