สมอง SML

คลังความรู้ / การตัดสินใจ (ADR)

#backend#adr#query-gateway#security#superseded

ADR-0006 /query/exec DML-only + ตารางระบบต้อง level >= 9

สถานะ: superseded โดย ADR-0011 ล็อก SQL เขียนจาก browser: ตารางเงิน/สต๊อก/GL ผ่าน /api/process เท่านั้น (front-matter ของ ADR: status: superseded by 0011..., ...0006...md:2). ยังอ่านเพื่อเข้าใจกฎชั้นล่างที่ยังอยู่ในโค้ด: NewWriteStatement (DML-only) และ ValidateUserLevel (ตารางระบบ).

ทำงานอย่างไร

  1. DML-only — domain/query.NewWriteStatement รับเฉพาะ INSERT / UPDATE / DELETE หรือ WITH ที่ห่อ DML; DDL และคำสั่งผู้ดูแล (CREATE, ALTER, DROP, TRUNCATE, GRANT, REVOKE, COPY) ถูกปฏิเสธ (ปัจจุบันเพิ่ม MERGE ด้วย) — query.go:55,335. สร้าง schema ต้องไปอยู่ใน backend/migrations/*.sql หรือ scripts/sql/*.sql (...0006...md:11).
  2. User level guardrail — claims/JWT พก Level (sml_user_list.user_level); การเขียนตาราง sml_user_list, sml_database_list*, erp_option โดย session ที่ Level < 9 ถูกปฏิเสธ 403 ErrForbiddenTable (query.go:63,363; ...0006...md:15).
  3. ตารางธุรกิจ (ic_trans, gl_journal, ...) ใน ADR นี้ยัง เขียนได้ — จุดอ่อนนี้คือเหตุผลที่เกิด ADR-0011.

ข้อควรระวัง

  • ห้ามอ้าง ADR-0006 เป็นกฎปัจจุบันสำหรับตารางเงิน/สต๊อก/GL: ปัจจุบันถูกบล็อกสำหรับทุกคนแล้ว (นโยบายล็อกการเขียนผ่าน Query Gateway (Query write policy / lockdown)).
  • ชื่อไฟล์ ADR มีคำว่า "no-new-permission-model" แต่เนื้อหาจริงคือ guardrail DML-only + level.
  • รูปแบบ regex ของตารางป้องกัน: (sml_user_list|sml_database_list\w*|erp_option) (query.go:63).

ที่มาในโค้ด

  • backend/docs/adr/0006-query-exec-no-new-permission-model.md:2 — สถานะ superseded.
  • backend/internal/domain/query/query.go:55 — ddlOrAdminKeyword.
  • backend/internal/domain/query/query.go:63 — protectedSystemTablePattern.
  • backend/internal/domain/query/query.go:335 — NewWriteStatement; :363 — ValidateUserLevel.

ดูเพิ่ม

ADR-0011 ล็อก SQL เขียนจาก browser: ตารางเงิน/สต๊อก/GL ผ่าน /api/process เท่านั้น · นโยบายล็อกการเขียนผ่าน Query Gateway (Query write policy / lockdown) · Query Gateway: /query/list, limit, batch, exec, execBatch · สารบัญ ADR ของ backend (Architecture Decision Records)