#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 (ตารางระบบ).
ทำงานอย่างไร
- 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). - User level guardrail — claims/JWT พก
Level(sml_user_list.user_level); การเขียนตารางsml_user_list,sml_database_list*,erp_optionโดย session ที่Level < 9ถูกปฏิเสธ 403ErrForbiddenTable(query.go:63,363;...0006...md:15). - ตารางธุรกิจ (
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)