ป้ายกำกับ: Resource Sharing

WSL: sharing Virtual Hard Disk (OS)WSL: sharing Virtual Hard Disk (OS)

ในฐานะ Senior Architect ที่ต้องออกแบบระบบที่มีความยืดหยุ่นและสามารถขยายตัวได้ (Scalability) การแชร์ทรัพยากรระหว่างผู้ใช้งานหลายราย (Multi-tenancy) เป็นหัวใจสำคัญของสถาปัตยกรรมระบบสมัยใหม่ แม้ว่าการจัดการ WSL (Windows Subsystem for Linux) จะเกี่ยวข้องกับการแชร์ Virtual Hard Disk (VHDX) ระหว่างผู้ใช้ แต่หลักการพื้นฐานของการจัดการสิทธิ์และการแชร์ทรัพยากรนั้น สามารถนำมาเปรียบเทียบกับแนวปฏิบัติที่ดีที่สุดในการจัดการฐานข้อมูลขนาดใหญ่ เช่น PostgreSQL ได้อย่างสมบูรณ์

หลักการแชร์ทรัพยากร: จาก VHDX สู่ PostgreSQL Schema

แทนที่จะแก้ไข Registry และจัดการไฟล์ VHDX โดยตรง ซึ่งเป็นวิธีการที่ซับซ้อนและเสี่ยงต่อการเกิด Access Denied เราควรใช้แนวทางที่เน้นการแยกส่วน (Isolation) และการจัดการสิทธิ์ (Permission Management) ในระดับฐานข้อมูล ซึ่งเป็นแนวทางที่ PostgreSQL ทำได้ดีเยี่ยม

เมื่อต้องการให้ผู้ใช้หลายคนเข้าถึงข้อมูลชุดเดียวกันโดยไม่ให้เกิดการทับซ้อนของสิทธิ์ (Permission Overlap) เราไม่ควรให้สิทธิ์ระดับ Superuser แต่ควรใช้การสร้าง Schema และการกำหนด Role อย่างชัดเจน

ขั้นตอนการกำหนดสิทธิ์การแชร์ข้อมูลใน PostgreSQL

  1. สร้างผู้ใช้ (User/Role): กำหนด Role ให้กับผู้ใช้งานแต่ละรายเพื่อจำกัดขอบเขตการเข้าถึง
  2. สร้าง Schema: ใช้ Schema เพื่อแยกกลุ่มข้อมูลตามผู้ใช้งานหรือฟังก์ชันการทำงาน
  3. กำหนดสิทธิ์ (Grant): ใช้คำสั่ง GRANT เพื่อให้สิทธิ์เฉพาะที่จำเป็นเท่านั้น (Principle of Least Privilege)

SQL

-- 1. สร้าง Role สำหรับผู้ใช้งานใหม่ (User A และ User B) 
CREATE ROLE user_a LOGIN PASSWORD 'secure_password_a';
CREATE ROLE user_b LOGIN PASSWORD 'secure_password_b';

-- 2. สร้าง Schema สำหรับเก็บข้อมูลที่แชร์ (Shared Data) 
CREATE SCHEMA shared_data;

-- 3. กำหนดสิทธิ์การใช้งาน Schema และตารางพื้นฐาน 
-- ให้ User A และ User B สามารถสร้าง Object ภายใน shared_data ได้
GRANT USAGE ON SCHEMA shared_data TO user_a,
                                 user_b;

-- 4. กำหนดสิทธิ์ SELECT, INSERT, UPDATE ให้เฉพาะตารางที่จำเป็นเท่านั้น
-- สมมติว่ามีตาราง 'product_info' ใน shared_data
GRANT SELECT, INSERT ON shared_data.product_info TO user_a,
                                   user_b;

-- 5. (Optional) หากต้องการให้ผู้ใช้ A สามารถดูข้อมูลได้ แต่แก้ไขไม่ได้ 
REVOKE UPDATE, DELETE ON shared_data.product_info FROM user_a;

การแก้ไขปัญหาการแชร์ทรัพยากร (Troubleshooting)

เมื่อเกิดปัญหาการเข้าถึงข้อมูลที่แชร์ (เทียบเท่ากับ Error: Access is denied ใน WSL) สาเหตุหลักมักเกิดจากการที่สิทธิ์ไม่เพียงพอ (Insufficient Privileges) หรือการตั้งค่า Role ผิดพลาด

  • Error: Permission denied for schema X: หมายความว่า Role นั้นไม่มีสิทธิ์ USAGE บน Schema นั้นๆ ต้องใช้คำสั่ง GRANT USAGE ON SCHEMA ... เพิ่มเติม
  • Error: relation ‘Y’ does not exist: อาจเกิดจากการที่ผู้ใช้พยายามเข้าถึง Object ที่ยังไม่ถูกสร้าง หรือไม่ได้ถูกแชร์สิทธิ์อย่างถูกต้อง
  • การจัดการ Lock: ใน PostgreSQL การ Lock ทรัพยากรจะถูกจัดการโดยระบบ Transaction (ACID) ซึ่งจะแจ้งเตือนเมื่อมีการขัดแย้งในการเขียน (Write Conflict) แทนการใช้ไฟล์ Lock ภายนอก

บทสรุป

การแชร์ทรัพยากรระหว่างผู้ใช้หลายราย ไม่ว่าจะเป็นการแชร์ OS Disk หรือการแชร์ฐานข้อมูลข้อมูลขนาดใหญ่ ควรยึดหลักการออกแบบที่เน้นการควบคุมสิทธิ์ในระดับสถาปัตยกรรม (Architectural Level) เสมอ การใช้ฟีเจอร์ Role และ Schema ของ PostgreSQL ทำให้เราสามารถจำลองการแยกส่วน (Isolation) และการควบคุมสิทธิ์ (Granular Control) ได้อย่างปลอดภัยและมีประสิทธิภาพสูงกว่าการจัดการระดับระบบปฏิบัติการ