PlusMagi's Blog By Pitt Phunsanit Backend,Database update table อัตโนมัติ

update table อัตโนมัติ

ในฐานะ System Specialist และ Senior Architect การรักษาความสมบูรณ์ของข้อมูล (Data Integrity) และความสม่ำเสมอของข้อมูล (Data Consistency) คือหัวใจสำคัญของการออกแบบระบบฐานข้อมูลที่เชื่อถือได้ เมื่อแอปพลิเคชันของเราต้องการให้ค่าบางอย่าง เช่น วันที่และเวลาที่ถูกอัปเดต (Timestamp), ค่า Hash ของรหัสผ่าน, หรือสถานะต่างๆ ถูกเปลี่ยนแปลงโดยอัตโนมัติทุกครั้งที่มีการดำเนินการ INSERT หรือ UPDATE โดยที่เราไม่จำเป็นต้องเขียนโค้ดในระดับ Application Layer การใช้ Database Trigger คือแนวทางที่ทรงพลังและเหมาะสมที่สุด

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

⚙️ หลักการทำงาน: Function และ Trigger ใน PostgreSQL

ใน PostgreSQL เราไม่ได้เพียงแค่สร้าง Trigger แต่เราจะสร้าง Function (ฟังก์ชัน) ที่ทำหน้าที่เป็นกล่องบรรจุตรรกะทางธุรกิจทั้งหมด (Business Logic) ไว้ก่อน จากนั้นจึงผูก Function นี้เข้ากับ Trigger เพื่อให้มันถูกเรียกใช้งานโดยอัตโนมัติ (Automatic Call) เมื่อมีการเปลี่ยนแปลงข้อมูลในตารางตามเหตุการณ์ที่กำหนด (เช่น INSERT หรือ UPDATE)

การทำงานนี้ช่วยให้เราสามารถกำหนดกฎเกณฑ์ที่ระดับฐานข้อมูล (Database Level) ซึ่งมีความน่าเชื่อถือสูงกว่าการเขียนโค้ดในระดับแอปพลิเคชัน

1. การเตรียมโครงสร้างตาราง (Table Setup)

เราเริ่มต้นด้วยการสร้างตาราง `users` โดยมีฟิลด์ที่จำเป็นสำหรับการเก็บรหัสผ่านอย่างปลอดภัย (Salt และ Hash) และฟิลด์สำคัญสำหรับติดตามการเปลี่ยนแปลงคือ `updated_at`:

SQL

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    password_hash VARCHAR(255) NOT NULL,
    salt VARCHAR(100) NOT NULL,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

2. การสร้าง Function (Business Logic)

ขั้นต่อไปคือการสร้างฟังก์ชันที่รับผิดชอบในการอัปเดตค่าต่างๆ โดยเฉพาะการตั้งค่า updated_at ให้เป็นเวลาปัจจุบันเสมอ ฟังก์ชันนี้จะถูกเรียกใช้ในรูปแบบ BEFORE เพื่อให้เราสามารถแก้ไขข้อมูลในแถว (Row) ก่อนที่มันจะถูกบันทึกจริง:

SQL

CREATE OR REPLACE FUNCTION update_timestamp_trigger()
RETURNS TRIGGER AS $$
BEGIN
    NEW.updated_at = NOW();
    RETURN NEW;
END;$$ LANGUAGE plpgsql;

3. การผูก Trigger (Execution Hook)

สุดท้าย เราต้องผูก Trigger เข้ากับตาราง `users` โดยกำหนดให้ฟังก์ชัน update_timestamp_trigger() ถูกเรียกใช้ทุกครั้งที่มีการ INSERT หรือ UPDATE ข้อมูล:

SQL

CREATE TRIGGER users_update_trigger
BEFORE INSERT OR UPDATE ON users
FOR EACH ROW
EXECUTE FUNCTION update_timestamp_trigger();

✅ การทดสอบระบบ

เมื่อเราทำการ INSERT หรือ UPDATE ข้อมูล ระบบจะเรียกใช้ Trigger และ Function ที่เราสร้างไว้โดยอัตโนมัติ ทำให้ค่า updated_at ถูกอัปเดตเป็นเวลาปัจจุบันเสมอโดยไม่ต้องระบุในคำสั่ง SQL:

SQL

-- ตัวอย่างการ INSERT ครั้งแรก (updated_at จะถูกตั้งค่า)
INSERT INTO users (username, password_hash, salt) VALUES ('alice', 'hash123', 'salt456');
-- รอสักครู่...
-- ตัวอย่างการ UPDATE ครั้งที่สอง (updated_at จะถูกอัปเดตใหม่)
UPDATE users SET username = 'alice_new' WHERE username = 'alice';

💡 บทสรุป: ประโยชน์ของการใช้ Database Trigger

การใช้ PostgreSQL Trigger และ Function เป็นวิธีที่ยอดเยี่ยมในการบังคับใช้กฎเกณฑ์ทางธุรกิจ (Business Rules) ที่ระดับฐานข้อมูลโดยตรง ซึ่งช่วยเพิ่มความน่าเชื่อถือ (Reliability) และความสมบูรณ์ของข้อมูล (Data Integrity) ได้อย่างมาก ไม่ว่าโค้ดแอปพลิเคชันส่วนใดจะทำการเปลี่ยนแปลงข้อมูล ตราบใดที่ Trigger ถูกผูกไว้ การอัปเดตค่าที่สำคัญ เช่น Timestamp หรือการเข้ารหัสรหัสผ่าน ก็จะเกิดขึ้นอย่างสมบูรณ์และอัตโนมัติเสมอ นี่คือหลักการสำคัญที่ Senior Architect ทุกคนควรทราบในการออกแบบระบบฐานข้อมูลที่แข็งแกร่ง