PlusMagi's Blog By Pitt Phunsanit Database TypeScript readonly คืออะไร? คู่มือการใช้งานคุณสมบัติอ่านได้อย่างเดียวเพื่อเพิ่มความปลอดภัยของโค้ด

TypeScript readonly คืออะไร? คู่มือการใช้งานคุณสมบัติอ่านได้อย่างเดียวเพื่อเพิ่มความปลอดภัยของโค้ด

ในโลกของการออกแบบระบบฐานข้อมูล (Database Design) ความน่าเชื่อถือและความสมบูรณ์ของข้อมูล (Data Integrity) ถือเป็นหัวใจสำคัญที่สุด การเปลี่ยนแปลงข้อมูลโดยไม่ตั้งใจ (Accidental Modification) หรือการเข้าถึงข้อมูลในลักษณะที่ไม่ควรทำ เป็นความเสี่ยงที่นักพัฒนาระดับอาวุโสต้องให้ความสำคัญ

แม้ว่าแนวคิดของ readonly จะเป็นที่รู้จักในภาษาโปรแกรมอย่าง TypeScript แต่ในบริบทของ PostgreSQL เราไม่ได้ใช้คีย์เวิร์ดนี้โดยตรง แต่เราใช้กลไกและคุณสมบัติระดับระบบ (System Features) เพื่อจำกัดขอบเขตการอ่านและป้องกันการแก้ไขข้อมูล ทำให้ข้อมูลหลัก (Master Data) ถูกปกป้องอย่างแน่นหนา บทความนี้จะนำเสนอแนวทางปฏิบัติที่ดีที่สุดในการจำลองคุณสมบัติ ‘อ่านได้อย่างเดียว’ เพื่อเพิ่มความปลอดภัยของโค้ดและโครงสร้างข้อมูลใน PostgreSQL

🛡️ ทำไมต้องใช้แนวคิด Readonly ใน PostgreSQL?

โดยพื้นฐานแล้ว ฐานข้อมูลจะอนุญาตให้มีการ SELECT, INSERT, UPDATE, และ DELETE ได้อย่างอิสระ การที่ข้อมูลบางส่วนควรถูกมองว่าเป็น ‘ค่าคงที่’ หรือ ‘ข้อมูลอ้างอิง’ ที่ไม่ควรถูกแก้ไขโดยแอปพลิเคชันส่วนใหญ่ จึงเป็นความจำเป็นที่ต้องจำกัดสิทธิ์การเข้าถึง การทำเช่นนี้ช่วยลดโอกาสในการเกิด Bug ที่มาจากมนุษย์ (Human Error) และทำให้ระบบมีเสถียรภาพสูงขึ้น

💡 3 กลไกหลักในการจำลอง Readonly ใน PostgreSQL

เพื่อบรรลุเป้าหมายการป้องกันการแก้ไขข้อมูล เราสามารถใช้คุณสมบัติหลักของ PostgreSQL ได้ 3 วิธี ดังนี้:

1. การใช้ Views (มุมมอง)

VIEW เป็นกลไกที่ทรงพลังที่สุดในการสร้างชั้นการเข้าถึงข้อมูลเสมือน (Virtual Layer) โดย View จะทำหน้าที่เป็นตารางเสมือนที่ถูกสร้างขึ้นจากคำสั่ง SELECT เท่านั้น เมื่อผู้ใช้หรือแอปพลิเคชันถูกกำหนดสิทธิ์ให้เข้าถึง View แทนตารางจริง พวกเขาจะสามารถ SELECT ข้อมูลได้เท่านั้น แต่จะไม่สามารถ UPDATE หรือ DELETE ข้อมูลต้นฉบับได้โดยตรง

SQL

-- 1. สร้างตารางข้อมูลหลัก (Master Table) ที่ไม่ต้องการให้แก้ไขโดยตรง
CREATE TABLE product_data (
    product_id INT PRIMARY KEY,
    product_name VARCHAR(100),
    price NUMERIC
);

-- 2. สร้าง VIEW ที่จำลองข้อมูลนี้ให้เป็น Readonly
CREATE VIEW product_read_view AS
SELECT product_id, product_name, price FROM product_data;

-- ผู้ใช้จะถูกให้สิทธิ์ SELECT บน product_read_view เท่านั้น
-- และไม่มีสิทธิ์ UPDATE/DELETE บน product_data

2. การจัดการสิทธิ์ (GRANT/REVOKE)

นี่คือการควบคุมระดับสิทธิ์ (Permission Level) ที่ชัดเจนที่สุด เราสามารถใช้คำสั่ง GRANT เพื่อให้สิทธิ์เฉพาะประเภทการดำเนินการ (เช่น SELECT) และใช้ REVOKE เพื่อถอนสิทธิ์การดำเนินการที่อันตราย (เช่น UPDATE หรือ DELETE) ออกจากผู้ใช้หรือบทบาท (Role) นั้น ๆ

SQL

-- สมมติว่าเรามี Role ชื่อ 'reporting_user'

-- 1. ให้สิทธิ์ในการอ่านข้อมูลเท่านั้น
GRANT SELECT ON product_data TO reporting_user;

-- 2. ระงับสิทธิ์ในการแก้ไขข้อมูลทั้งหมด
REVOKE INSERT, UPDATE, DELETE ON product_data FROM reporting_user;

3. การใช้ Row-Level Security (RLS)

สำหรับกรณีที่ต้องการจำกัดการมองเห็นข้อมูลตามเงื่อนไข (เช่น พนักงานแต่ละคนเห็นข้อมูลเฉพาะของแผนกตัวเอง) PostgreSQL รองรับ Row-Level Security ซึ่งจะเพิ่ม Policy เพื่อให้มั่นใจว่าแม้ผู้ใช้จะมีสิทธิ์ SELECT แต่ก็จะเห็นเฉพาะแถวข้อมูลที่ตรงตามเงื่อนไขที่กำหนดเท่านั้น

✅ บทสรุป: การออกแบบที่ปลอดภัย

การนำแนวคิด readOnly มาใช้ใน PostgreSQL ไม่ใช่แค่การใช้คำสั่งเดียว แต่เป็นการออกแบบสถาปัตยกรรมข้อมูลที่รอบด้าน โดยการผสมผสานการใช้ VIEW เพื่อสร้างชั้นการเข้าถึง, การใช้ GRANT/REVOKE เพื่อควบคุมสิทธิ์อย่างละเอียด, และการใช้ RLS เพื่อจำกัดขอบเขตการมองเห็นข้อมูล

การทำเช่นนี้จะช่วยยกระดับความปลอดภัยของฐานข้อมูลของคุณให้เป็นระดับ Senior Architect อย่างแท้จริง ทำให้มั่นใจได้ว่าข้อมูลสำคัญจะถูกปกป้องจากการเปลี่ยนแปลงที่ไม่ได้รับอนุญาตเสมอ