ทำความเข้าใจ View และ Schema Security
เวลาเราทำงานกับฐานข้อมูล MS-SQL เรามักมีข้อมูลจำนวนมากเก็บอยู่ในตารางหลัก การให้ทุกคนเข้าถึงตารางเหล่านั้นโดยตรงเปรียบเหมือนการให้กุญแจบ้านกับคนแปลกหน้า ซึ่งเสี่ยงเกินไป View (ตารางจำลอง) จึงเข้ามาแก้ปัญหานี้โดยการสร้างหน้าต่างมองข้อมูลเฉพาะส่วนที่เราต้องการให้คนอื่นเห็นเท่านั้น
View ไม่ใช่ตารางที่เก็บข้อมูลจริง แต่มันคือคำสั่ง Query (การสั่งดึงข้อมูล) ที่ถูกบันทึกไว้เพื่อเรียกใช้ใหม่ได้ตลอดเวลา มันช่วยให้เราซ่อนคอลัมน์ที่ไม่จำเป็นหรือข้อมูลที่เป็นความลับ เช่น เงินเดือนพนักงาน ออกไปได้ Schema (โครงสร้างการจัดกลุ่มข้อมูล) ก็ทำหน้าที่เหมือนแฟ้มเก็บเอกสารที่แบ่งหมวดหมู่สิทธิ์การเข้าถึงให้ชัดเจนขึ้นอีกชั้น
การรู้เรื่องนี้สำคัญมากสำหรับโปรแกรมเมอร์ เพราะในโลกการทำงานจริง คุณไม่ควรให้ใครเข้าถึงข้อมูลทั้งหมดในฐานข้อมูลโดยไม่จำเป็น การใช้ View และ Schema ช่วยลดความผิดพลาดและเพิ่มความปลอดภัยให้กับซอฟต์แวร์ที่คุณดูแลอยู่ได้มหาศาล นี่คือทักษะพื้นฐานที่แยกโปรแกรมเมอร์ทั่วไปออกจากคนที่ใส่ใจเรื่องความปลอดภัย
สร้าง View เพื่อจำกัดการเข้าถึงข้อมูล
ลองนึกภาพว่าคุณมีตารางเก็บข้อมูลพนักงานทั้งหมด ทั้งชื่อ เบอร์โทร และเงินเดือน แต่คุณต้องการให้ฝ่ายประชาสัมพันธ์เห็นแค่ชื่อและเบอร์โทรเท่านั้น การสร้าง View จะช่วยให้คุณคัดกรองข้อมูลเฉพาะส่วนที่เขาต้องใช้โดยไม่ต้องไปยุ่งกับตารางต้นฉบับเลย
ขั้นตอนการสร้าง View ทำได้ง่ายผ่านคำสั่ง CREATE VIEW ตามด้วยชื่อที่คุณต้องการตั้ง จากนั้นใส่คำสั่ง SELECT เพื่อเลือกเฉพาะข้อมูลที่อนุญาตให้เข้าถึงได้ วิธีนี้ช่วยให้คนอื่นเขียนโปรแกรมติดต่อฐานข้อมูลได้ง่ายขึ้น เพราะไม่ต้องเขียนเงื่อนไขซับซ้อนเองทุกครั้ง
ข้อควรระวังสำหรับมือใหม่คือ อย่าลืมว่า View ก็คือคำสั่งดึงข้อมูล หากคุณไปลบข้อมูลในตารางต้นฉบับ ข้อมูลใน View ก็จะหายไปด้วย การตั้งชื่อ View ควรให้สื่อความหมายชัดเจน เพื่อให้เพื่อนร่วมทีมเข้าใจได้ทันทีว่าตารางจำลองนี้สร้างขึ้นมาเพื่อวัตถุประสงค์อะไร
-- สร้าง View เพื่อแสดงแค่ข้อมูลพนักงานทั่วไป
CREATE VIEW View_EmployeePublic AS
SELECT FullName, PhoneNumber
FROM Employees
WHERE IsActive = 1;
คำอธิบายโค้ด:
CREATE VIEW View_EmployeePublic: เป็นการสั่งสร้างตารางจำลองชื่อว่า View_EmployeePublicSELECT FullName, PhoneNumber: เลือกเฉพาะชื่อและเบอร์โทรที่ต้องการให้คนอื่นเห็นFROM Employees: ดึงข้อมูลมาจากตารางหลักชื่อ EmployeesWHERE IsActive = 1: กรองเอาเฉพาะพนักงานที่ยังทำงานอยู่เท่านั้น
ผลลัพธ์: เมื่อมีคนสั่ง SELECT * FROM View_EmployeePublic ระบบจะแสดงผลแค่รายการชื่อและเบอร์โทรของพนักงานที่ยังทำงานอยู่เท่านั้น โดยไม่มีข้อมูลเงินเดือนหรือข้อมูลส่วนตัวอื่นโผล่มาเลย
การจัดกลุ่มด้วย Database Schemas
Schema คือกล่องเก็บตารางหรือ View ที่เราสร้างขึ้นมาเพื่อจัดหมวดหมู่ สมมติว่าในฐานข้อมูลหนึ่งตัวมีทั้งระบบบัญชีและระบบทรัพยากรบุคคล การเอาทุกอย่างมากองรวมกันจะทำให้จัดการสิทธิ์ได้ยากมาก เราจึงต้องแยกกล่องเก็บข้อมูลให้เป็นสัดส่วน
ถ้าเราสร้าง Schema ชื่อ HR สำหรับฝ่ายบุคคล และ Finance สำหรับฝ่ายบัญชี เราจะสามารถกำหนดได้ว่าใครมีสิทธิ์เข้าถึงกล่องไหนได้บ้าง วิธีนี้ช่วยป้องกันไม่ให้คนจากฝ่ายบัญชีเผลอไปแก้ไขข้อมูลในฝ่ายบุคคลโดยไม่ได้ตั้งใจ ซึ่งเป็นมาตรฐานสากลในการทำระบบที่ปลอดภัย
มือใหม่มักจะใช้ Schema เริ่มต้นที่ชื่อว่า dbo (Database Owner) ซึ่งเป็นค่าเริ่มต้นของระบบ การสร้าง Schema ใหม่เองจะช่วยให้คุณทำงานร่วมกับทีมได้มืออาชีพขึ้นมาก เพราะการแบ่งงานเป็นส่วนๆ ทำให้เราจัดการเรื่อง Permission (สิทธิ์การเข้าถึงข้อมูล) ได้ละเอียดและปลอดภัยกว่าเดิม
-- สร้าง Schema ใหม่แยกหมวดหมู่
CREATE SCHEMA HR;
GO
-- ย้ายตารางพนักงานไปอยู่ภายใต้ Schema HR
ALTER SCHEMA HR TRANSFER dbo.Employees;
คำอธิบายโค้ด:
CREATE SCHEMA HR: สร้างกล่องเก็บข้อมูลใหม่ที่ชื่อว่า HRGO: เป็นคำสั่งคั่นระหว่างการทำงานเพื่อบอกให้ระบบประมวลผลคำสั่งก่อนหน้าให้เสร็จก่อนALTER SCHEMA HR TRANSFER: เป็นการย้ายตารางต้นฉบับเดิมจาก dbo ไปเก็บไว้ในกล่อง HR แทน
ผลลัพธ์: ตอนนี้ตารางพนักงานจะถูกเรียกใช้ผ่านชื่อ HR.Employees แทน ซึ่งเป็นการจัดหมวดหมู่ข้อมูลที่ช่วยให้เราจัดการสิทธิ์เข้าถึงได้เป็นระเบียบขึ้น
การให้สิทธิ์เข้าถึงด้วย GRANT
เมื่อสร้าง View และจัด Schema เรียบร้อยแล้ว ขั้นตอนสุดท้ายคือการให้สิทธิ์คนอื่นเข้าใช้งาน เราใช้คำสั่ง GRANT เพื่อระบุว่าใครสามารถทำอะไรได้บ้าง เช่น ให้ดูได้เฉพาะข้อมูล หรือให้แก้ไขข้อมูลได้ด้วย
การให้สิทธิ์ควรยึดหลักการ Least Privilege (การให้สิทธิ์น้อยที่สุดเท่าที่จำเป็น) เสมอ คือให้สิทธิ์แค่สิ่งที่เขาต้องใช้ทำงานเท่านั้น หากเขามีหน้าที่แค่ดูข้อมูล ก็ให้สิทธิ์แค่ SELECT ห้ามให้สิทธิ์ DELETE หรือ DROP เด็ดขาด
ความผิดพลาดที่พบบ่อยคือการให้สิทธิ์แบบเหมาเข่ง เช่น ให้สิทธิ์ db_owner (สิทธิ์สูงสุด) กับทุกคนในทีม ซึ่งอันตรายมากหากใครคนใดคนหนึ่งเผลอพิมพ์คำสั่งผิดพลาดจนข้อมูลหายไปทั้งหมด การฝึกนิสัยให้สิทธิ์แบบจำกัดจะช่วยปกป้องคุณจากการโดนตำหนิเมื่อเกิดเหตุไม่คาดฝัน
-- ให้สิทธิ์ผู้ใช้งานคนอื่นให้ดูข้อมูลได้แค่ View ที่เราสร้าง
GRANT SELECT ON View_EmployeePublic TO SalesTeam;
คำอธิบายโค้ด:
GRANT SELECT: อนุญาตให้ทำได้แค่การดึงข้อมูลมาอ่านเท่านั้นON View_EmployeePublic: ระบุว่าให้สิทธิ์เฉพาะกับ View ที่เราสร้างขึ้นTO SalesTeam: ระบุชื่อกลุ่มผู้ใช้งานหรือบุคคลที่ต้องการให้สิทธิ์
ผลลัพธ์: ผู้ใช้งานในกลุ่ม SalesTeam จะสามารถใช้คำสั่ง SELECT เพื่อดูข้อมูลจาก View_EmployeePublic ได้ แต่ถ้าเขาพยายามแก้ไขหรือลบข้อมูล ระบบจะแจ้งเตือนว่าไม่มีสิทธิ์ทันที
ข้อควรระวังและแนวปฏิบัติที่ดี
ในการทำงานจริง อย่าลืมว่า View ไม่ได้ช่วยเรื่องความเร็วเสมอไป หากคำสั่งข้างในซับซ้อนเกินไป อาจทำให้ฐานข้อมูลทำงานช้าลงได้ ควรทดสอบประสิทธิภาพก่อนนำไปใช้ในโปรเจกต์ใหญ่ๆ และหลีกเลี่ยงการสร้าง View ซ้อน View หลายชั้นเกินความจำเป็น
อีกเรื่องที่ต้องระวังคือการตั้งชื่อ สิ่งสำคัญคือการสื่อสารกับทีมให้เข้าใจตรงกันว่า View ไหนเก็บข้อมูลอะไร และใครเป็นคนดูแล หากคุณทำโปรเจกต์คนเดียว ให้ลองฝึกทำเอกสารกำกับไว้สั้นๆ ว่า View นี้สร้างขึ้นเพื่ออะไร เพื่อให้ตัวเองในอนาคตกลับมาอ่านแล้วเข้าใจได้ทันที
ถ้าคุณกำลังฝึกทำ Portfolio (แฟ้มสะสมผลงาน) การใส่เรื่องการวางโครงสร้างฐานข้อมูลที่มี Schema แบ่งหมวดหมู่ชัดเจน จะช่วยให้ผู้สัมภาษณ์งานเห็นว่าคุณไม่ได้แค่เขียนโค้ดเป็น แต่คุณเข้าใจเรื่องความปลอดภัยและการจัดระเบียบข้อมูล ซึ่งเป็นสิ่งที่บริษัทมองหาในตัวโปรแกรมเมอร์คุณภาพ
สรุป: การนำไปใช้จริงในงานโปรแกรมเมอร์
สรุปคือ View ช่วยให้เราซ่อนข้อมูลที่ละเอียดอ่อนและทำให้การดึงข้อมูลสะดวกขึ้น ส่วน Schema ช่วยจัดระเบียบให้งานดูเป็นมืออาชีพและจัดการสิทธิ์ได้ง่าย ลองนึกภาพว่าคุณกำลังทำระบบร้านค้าออนไลน์ คุณควรแยก Schema ของระบบสมาชิก ออกจาก Schema ของระบบสต็อกสินค้า
สำหรับระบบสมาชิก คุณอาจสร้าง View เพื่อดึงข้อมูลประวัติการสั่งซื้อออกมาแสดงในหน้าโปรไฟล์ผู้ใช้งาน โดยไม่ต้องให้เขาเห็นข้อมูลต้นทุนสินค้าหรือกำไรของร้าน การทำแบบนี้ไม่เพียงแต่ทำให้ระบบปลอดภัย แต่ยังช่วยให้คุณเขียนโค้ดในส่วนของ Frontend (ส่วนที่ผู้ใช้มองเห็น) ได้ง่ายขึ้นอีกด้วย
การฝึกใช้เทคนิคเหล่านี้ตั้งแต่วันนี้ จะทำให้คุณกลายเป็นโปรแกรมเมอร์ที่คิดถึงเรื่องความปลอดภัยก่อนเขียนโค้ดเสมอ เริ่มต้นจากการลองสร้าง View ง่ายๆ ในโปรเจกต์ที่ทำอยู่ แล้วลองจัดหมวดหมู่ตารางด้วย Schema ดูครับ มันจะช่วยให้คุณเห็นภาพรวมของระบบดีขึ้นกว่าการเขียนโค้ดแบบสะเปะสะปะแน่นอน