ป้ายกำกับ: Professional

Oracle: ข้าม schema ของ userOracle: ข้าม schema ของ user

การจัดการสิทธิ์การเข้าถึงข้อมูลข้าม Schema (Cross-Schema Access) เป็นหัวใจสำคัญของการออกแบบระบบฐานข้อมูลที่ปลอดภัยและมีความยืดหยุ่นใน PostgreSQL โดยหลักการแล้ว แต่ละ User หรือ Role ในระบบควรมีขอบเขตการมองเห็นข้อมูล (Visibility) ที่จำกัดตามหลักการ Least Privilege (สิทธิ์น้อยที่สุด) หาก User หนึ่งไม่ได้รับอนุญาตให้เข้าถึงข้อมูลใน Schema ของ User อื่น การพยายามเข้าถึงนั้นจะถูกระบบปฏิเสธทันที

บทความนี้จะแนะนำขั้นตอนและวิธีการที่ถูกต้องในการอนุญาตให้ User หนึ่งสามารถเข้าถึงข้อมูลจาก Schema ของ User อื่นได้อย่างเป็นระบบ โดยใช้คำสั่งมาตรฐานของ PostgreSQL

หลักการทำงานของ Cross-Schema Access ใน PostgreSQL

ใน PostgreSQL, Schema ทำหน้าที่เป็น Namespace (พื้นที่ชื่อ) ที่จัดกลุ่ม Object (เช่น Tables, Functions) ต่างๆ ภายใน Database เดียวกัน เมื่อต้องการให้ User B เข้าถึง Table ที่เป็นของ User A (หรือ Schema ของ User A) User A จะต้องเป็นผู้ดำเนินการให้สิทธิ์ (Grant) อย่างชัดเจน

ขั้นตอนที่ 1: การให้สิทธิ์ (GRANT)

สมมติว่าเรามี 2 Roles คือ owner_a (เจ้าของข้อมูล) และ consumer_b (ผู้ใช้งานที่ต้องการเข้าถึงข้อมูล) และมี Table ชื่อ products อยู่ใน Schema ของ owner_a

owner_a จะต้องรันคำสั่ง GRANT เพื่อมอบสิทธิ์ที่จำเป็นให้กับ consumer_b เท่านั้น:

SQL

SQL

-- 1. ให้สิทธิ์อ่านข้อมูล (SELECT) บน Table ทั้งหมดใน Schema_A<br>GRANT SELECT ON schema_a.products TO consumer_b;<br><br>-- 2. หากต้องการให้สิทธิ์เรียกใช้ Function หรือ Procedure<br>GRANT EXECUTE ON schema_a.calculate_inventory TO consumer_b;<br><br>-- 3. (ทางเลือก) หากต้องการให้สิทธิ์สร้าง Object ใน Schema นั้นด้วย<br>GRANT CREATE ON SCHEMA schema_a TO consumer_b;

ขั้นตอนที่ 2: วิธีการเรียกใช้งานข้อมูล (Accessing Data)

เมื่อ consumer_b ได้รับสิทธิ์แล้ว จะไม่สามารถเรียกใช้ Table ได้ด้วยชื่อ Table อย่างเดียว แต่ต้องระบุชื่อ Schema และชื่อ Table อย่างชัดเจนเสมอ เพื่อให้ระบบรู้ว่ากำลังอ้างถึง Object ใด

consumer_b จะรันคำสั่ง SQL ดังนี้:

SQL

SQL

SELECT * FROM schema_a.products WHERE product_id = '1,2,3';

ข้อควรระวังสำหรับ Senior Architect

การให้สิทธิ์ควรเป็นไปตามหลักการ Least Privilege เสมอ หาก consumer_b ต้องการเพียงแค่ดูข้อมูล (Read-Only) ก็ควรให้สิทธิ์เพียง SELECT เท่านั้น ห้ามให้สิทธิ์ INSERT, UPDATE, หรือ DELETE เว้นแต่จะจำเป็นอย่างยิ่งจริง ๆ การจำกัดสิทธิ์อย่างเข้มงวดนี้ช่วยลดความเสี่ยงด้านความปลอดภัยของข้อมูลองค์กรได้เป็นอย่างดี

บทสรุป (Conclusion)

การจัดการการเข้าถึงข้อมูลข้าม Schema ใน PostgreSQL ไม่ใช่แค่การรันคำสั่ง GRANT เท่านั้น แต่คือการออกแบบระบบที่คำนึงถึงความปลอดภัยเป็นอันดับแรก การระบุสิทธิ์ที่เฉพาะเจาะจง (Granular Permissions) และการบังคับให้ผู้ใช้งานเรียกใช้ Object ด้วยการระบุ Schema อย่างครบถ้วน จะช่วยให้มั่นใจได้ว่าข้อมูลของแต่ละส่วนงานจะถูกแยกออกจากกันอย่างชัดเจนและปลอดภัยสูงสุด