การจัดการสิทธิ์เพื่อเข้าถึงข้อมูลข้าม User หรือ Schema ใน Oracle Database เป็นเรื่องสำคัญทั้งในแง่ของความปลอดภัยและการจัดการโครงสร้างข้อมูล โดยปกติแล้ว User หนึ่งจะไม่สามารถมองเห็นหรือจัดการ Table ของ User อื่นได้เลย หากไม่ได้รับอนุญาต นี่คือขั้นตอนและวิธีการตั้งค่าเพื่อให้สามารถใช้งานข้าม Schema ได้อย่างถูกต้องครับ
การให้สิทธิ์เข้าถึง ( Granting Privileges )
สมมติว่าเรามี 2 Users คือ User_A ( เจ้าของข้อมูล ) และ User_B ( ผู้ขอใช้งาน ) หาก User_B ต้องการอ่านข้อมูลจาก Table ที่ชื่อ EMPLOYEES ของ User_A จะต้องดำเนินการดังนี้
การให้สิทธิ์รายคำสั่ง
ให้ User_A ( หรือ Admin ) รันคำสั่ง SQL
- อ่านข้อมูล:
GRANT SELECT ON User_A.EMPLOYEES TO User_B; - เพิ่ม/แก้ไข/ลบ:
GRANT INSERT, UPDATE, DELETE ON User_A.EMPLOYEES TO User_B; - รัน Procedure/Function:
GRANT EXECUTE ON User_A.MY_PROCEDURE TO User_B;
วิธีการเรียกใช้งาน ( Referencing Objects )
เมื่อได้รับสิทธิ์แล้ว User_B สามารถเข้าถึงข้อมูลได้ 2 วิธีหลัก
- การเรียกแบบระบุชื่อ Schema ( Fully Qualified Name )
User_B ต้องระบุชื่อเจ้าของ Table นำหน้าเสมอSELECT * FROM User_A.EMPLOYEES; - การใช้ Synonym ( เพื่อความสะดวก )
หากไม่อยากพิมพ์ชื่อ User_A นำหน้าทุกครั้ง User_B สามารถสร้าง Synonym ( ชื่อนามแฝง ) ไว้ใน Schema ของตัวเองได้
— สร้าง Synonym ส่วนตัวใน User_BCREATE SYNONYM EMPLOYEES FOR User_A.EMPLOYEES;
— คราวนี้เรียกใช้ได้โดยตรงSELECT * FROM EMPLOYEES; - การจัดการสิทธิ์ผ่าน Role ( แนะนำสำหรับระบบใหญ่ )
หากมี User จำนวนมากที่ต้องเข้าถึงข้อมูลชุดเดียวกัน การไล่GRANTทีละคนจะจัดการยาก แนะนำให้ใช้ Role แทน- สร้าง Role:
CREATE ROLE READ_ONLY_A; - ให้สิทธิ์ Role:
GRANT SELECT ON User_A.EMPLOYEES TO READ_ONLY_A; - มอบ Role ให้ Users:
GRANT READ_ONLY_A TO User_B, User_C, User_D;
- สร้าง Role:
ข้อควรระวังและเทคนิคเพิ่มเติม
- With Grant Option: หากต้องการให้ User_B สามารถไปให้สิทธิ์คนอื่นต่อได้ ต้องใช้
GRANT SELECT ON ... TO User_B WITH GRANT OPTION; - Public Synonym: หากต้องการให้ ทุก User ใน Database เรียกใช้ Table นี้ได้โดยไม่ต้องระบุชื่อ Schema สามารถสร้าง
CREATE PUBLIC SYNONYMได้ ( แต่ควรใช้อย่างระมัดระวังเรื่องความปลอดภัย ) - การ Backup: ตามที่คุณเคยจดบันทึกไว้เกี่ยวกับการทำ Backup / Snapshot ก่อนลง Nginx ใหม่ หลักการเดียวกันนี้ใช้กับ Database ได้ครับ ก่อนจะมีการ
GRANTสิทธิ์จำนวนมาก หรือเปลี่ยนโครงสร้าง Schema การทำ Export ( expdp ) หรือ Snapshot ของ VM / Database ไว้ก่อนจะช่วยให้กู้คืนระบบได้หากเกิดความผิดพลาดในการจัดการสิทธิ์
คำแนะนำ: การให้สิทธิ์ SELECT ANY TABLE หรือ DBA Role แก่ User ทั่วไปเป็นสิ่งที่ไม่ควรทำอย่างยิ่ง เพราะจะทำให้ User นั้นเข้าถึงข้อมูลได้ทั้ง Database ซึ่งผิดหลักการ Least Privilege ( การให้สิทธิ์เท่าที่จำเป็น ) ครับ
อ่านเพิ่มเติม