ป้ายกำกับ: Sql

ตรวจฟอร์มด้วย HTML 5 / jQuery Validation Pluginตรวจฟอร์มด้วย HTML 5 / jQuery Validation Plugin

ในโลกของการพัฒนาเว็บแอปพลิเคชัน การรับข้อมูลจากผู้ใช้ (User Input) เป็นขั้นตอนที่สำคัญที่สุดและเสี่ยงต่อความผิดพลาดมากที่สุด แม้ว่าเราจะใช้เทคนิคการตรวจสอบฝั่งไคลเอนต์ (Client-side Validation) เช่น HTML5 หรือ JavaScript (jQuery Validation) เพื่อมอบประสบการณ์ที่ดีแก่ผู้ใช้ แต่ในฐานะ Senior Architect เราต้องย้ำเตือนเสมอว่าการตรวจสอบเหล่านี้เป็นเพียงมาตรการเสริมเท่านั้น และไม่สามารถใช้แทนการตรวจสอบข้อมูลที่ฝั่งเซิร์ฟเวอร์ (Server-side Validation) ได้อย่างเด็ดขาด

ทำไม PostgreSQL จึงเป็นหัวใจของการตรวจสอบข้อมูล?

เมื่อข้อมูลถูกส่งมาถึงระบบแล้ว การรับประกันความสมบูรณ์และความถูกต้องของข้อมูล (Data Integrity) จะต้องเกิดขึ้นที่ระดับฐานข้อมูล (Database Layer) ซึ่ง PostgreSQL มีเครื่องมือที่ทรงพลังอย่าง CHECK Constraints, Triggers, และ Stored Procedures ที่ช่วยให้เราสามารถบังคับใช้กฎทางธุรกิจ (Business Rules) ก่อนที่ข้อมูลจะถูกบันทึกจริง ๆ นี่คือแนวทางที่ปลอดภัยที่สุดในการป้องกันข้อมูลขยะ (Garbage Data) เข้าสู่ระบบ

การใช้ CHECK Constraints เพื่อบังคับใช้กฎ

CHECK Constraints คือกลไกที่ยอดเยี่ยมที่สุดในการตรวจสอบความถูกต้องของข้อมูลในระดับคอลัมน์หรือแถว (Row Level) โดยเราสามารถกำหนดเงื่อนไขทางตรรกะที่ข้อมูลต้องเป็นไปตามนั้นได้ ตัวอย่างเช่น หากเรามีตารางสำหรับบันทึกคำสั่งซื้อ (Orders) เราต้องการให้ราคาสินค้า (price) ต้องไม่ติดลบ และจำนวน (quantity) ต้องมากกว่าศูนย์เสมอ

SQL

-- 1. สร้างตารางสินค้า (Products) พร้อมกำหนด CHECK Constraint<br>CREATE TABLE products ( <br>    product_id SERIAL PRIMARY KEY, <br>    product_name VARCHAR(255) NOT NULL, <br>    price NUMERIC(10, 2) NOT NULL, <br>    stock_quantity INTEGER NOT NULL <br>    -- กำหนดว่าราคาต้องมากกว่า 0 เสมอ<br>    CONSTRAINT check_price_positive CHECK (price > 0), <br>    -- กำหนดว่าสต็อกต้องไม่เป็นค่าลบ<br>    CONSTRAINT check_stock_non_negative CHECK (stock_quantity >= 0) <br>);<br><br>-- 2. ตัวอย่างการพยายามใส่ข้อมูลที่ผิดกฎ (จะเกิด Error)<br>INSERT INTO products (product_name, price, stock_quantity) <br>VALUES ('Defective Item', -10.00, 5);

เมื่อรันคำสั่งข้างต้น PostgreSQL จะปฏิเสธการบันทึกข้อมูลทันที เนื่องจากละเมิด check_price_positive ซึ่งแสดงให้เห็นว่าการตรวจสอบข้อมูลที่ระดับฐานข้อมูลนั้นแข็งแกร่งกว่าการตรวจสอบที่ระดับแอปพลิเคชันมาก

การใช้ Triggers สำหรับการตรวจสอบที่ซับซ้อน

ในกรณีที่การตรวจสอบมีความซับซ้อนและต้องอ้างอิงข้อมูลจากหลายคอลัมน์หรือหลายตาราง (เช่น การตรวจสอบว่าสินค้าที่กำลังจะสั่งซื้อยังมีสต็อกเพียงพอหรือไม่) เราจะใช้ Triggers ซึ่งจะรันชุดคำสั่ง SQL อัตโนมัติก่อน (BEFORE) หรือหลัง (AFTER) การดำเนินการ INSERT, UPDATE หรือ DELETE

SQL

-- ตัวอย่าง Trigger: ตรวจสอบก่อนการอัปเดต (BEFORE UPDATE) <br>-- ว่าจำนวนสินค้าที่สั่งซื้อ (new.quantity) ไม่เกินสต็อกที่มีอยู่ (old.stock_quantity)<br>CREATE OR REPLACE FUNCTION validate_order_stock() <br>RETURNS TRIGGER AS $$ <br>BEGIN <br>    IF NEW.quantity > OLD.stock_quantity THEN <br>        RAISE EXCEPTION 'ไม่สามารถสั่งซื้อได้: จำนวนที่ร้องขอ (%) เกินสต็อกที่มี (%)', NEW.quantity, OLD.stock_quantity; <br>    END IF; <br>    RETURN NEW; <br>END; <br>$$ LANGUAGE plpgsql; <br><br>-- ผูก Trigger เข้ากับตาราง (สมมติว่ามีตาราง orders)<br>CREATE TRIGGER check_order_stock <br>BEFORE UPDATE ON orders <br>FOR EACH ROW <br>EXECUTE FUNCTION validate_order_stock();

บทสรุป

การตรวจสอบความถูกต้องของข้อมูลฟอร์มไม่ควรถูกมองว่าเป็นเพียงฟังก์ชันของ JavaScript หรือ HTML5 เท่านั้น แต่ต้องถูกยกระดับให้เป็นกลไกสำคัญที่ฝังอยู่ในระดับฐานข้อมูลด้วย การใช้ CHECK Constraints และ Triggers ของ PostgreSQL ทำให้เรามั่นใจได้ว่า ไม่ว่าข้อมูลจะถูกส่งมาด้วยช่องทางใดก็ตาม ข้อมูลที่ถูกบันทึกในฐานข้อมูลของเราจะเป็นข้อมูลที่ถูกต้องตามกฎเกณฑ์ทางธุรกิจ (Business Rules) เสมอ นี่คือหลักการของความปลอดภัยทางข้อมูลที่ Senior Architect ทุกคนต้องยึดถือ