โครงสร้างทริกเกอร์: BEFORE/AFTER, FOR EACH ROW
ทำความเข้าใจจังหวะการทำงานของทริกเกอร์ ระดับการทำงาน (ระดับแถวเทียบกับระดับคำสั่ง) และความหมายของ NEW กับ OLD ภายในฟังก์ชันทริกเกอร์
โครงสร้างทริกเกอร์: BEFORE/AFTER, FOR EACH ROW เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
ทริกเกอร์คืออะไร
ทริกเกอร์คือฟังก์ชันที่ฐานข้อมูลเรียกใช้อัตโนมัติก่อนหรือหลัง INSERT, UPDATE, DELETE หรือ TRUNCATE บนตาราง
สองส่วนประกอบ: ฟังก์ชัน + ทริกเกอร์
คุณเขียนฟังก์ชันที่คืนค่า trigger จากนั้นแนบฟังก์ชันนั้นเข้ากับตาราง:
CREATE OR REPLACE FUNCTION set_updated_at()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at := NOW();
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trg_set_updated_at
BEFORE UPDATE ON users
FOR EACH ROW EXECUTE FUNCTION set_updated_at();BEFORE เทียบกับ AFTER
- BEFORE — ทำงานก่อนเขียนแถว และสามารถแก้ไข NEW ได้
- AFTER — ทำงานหลังเขียนข้อมูล สำหรับผลข้างเคียง เช่น การตรวจสอบและการแจ้งเตือน
FOR EACH ROW เทียบกับ FOR EACH STATEMENT
- FOR EACH ROW — ทำงานหนึ่งครั้งต่อแถวที่ได้รับผลกระทบ และเข้าถึง
NEWกับOLDได้ - FOR EACH STATEMENT — ทำงานหนึ่งครั้งต่อคำสั่ง โดยเข้าถึงข้อมูลรายแถวไม่ได้
NEW และ OLD
ภายในทริกเกอร์ระดับแถว:
NEW— แถวใหม่ (INSERT, UPDATE)OLD— แถวก่อนหน้า (UPDATE, DELETE)
ค่าที่คืนมีความสำคัญ
สำหรับทริกเกอร์ระดับแถวแบบ BEFORE:
- คืนค่า
NEWเพื่อดำเนินการกับแถวนั้นต่อ - คืนค่า
NEWที่แก้ไขแล้วเพื่อเปลี่ยนข้อมูลที่จะจัดเก็บ - คืนค่า
NULLเพื่อยกเลิกการดำเนินการกับแถวนั้น
ตัวกรอง WHEN
การทำงานแบบมีเงื่อนไข:
CREATE TRIGGER trg_log_status
AFTER UPDATE OF status ON orders
FOR EACH ROW WHEN (OLD.status IS DISTINCT FROM NEW.status)
EXECUTE FUNCTION log_status_change();OF คอลัมน์
BEFORE หรือ AFTER UPDATE สามารถทำงานเฉพาะเมื่อคอลัมน์ที่ระบุมีการเปลี่ยนแปลง:
CREATE TRIGGER ... AFTER UPDATE OF status ON orders ...ทริกเกอร์หลายรายการ
ทริกเกอร์จะทำงานตามลำดับตัวอักษรของชื่อทริกเกอร์ ให้ใช้คำนำหน้า (00_, 10_, ...) เพื่อควบคุมลำดับ
ประสิทธิภาพของทริกเกอร์
ทริกเกอร์ระดับแถวทำงานทีละแถว ตรรกะที่ซับซ้อนภายในทริกเกอร์ระดับแถว × DML จำนวนมากจึงทำงานช้า ควรใช้ทริกเกอร์ระดับคำสั่งสำหรับผลข้างเคียงกับข้อมูลจำนวนมาก
การปิดใช้งานทริกเกอร์
ข้ามชั่วคราว:
ALTER TABLE orders DISABLE TRIGGER trg_audit;
-- bulk load...
ALTER TABLE orders ENABLE TRIGGER trg_audit;
-- Disable ALL triggers (use carefully):
ALTER TABLE orders DISABLE TRIGGER ALL;การเรียกทริกเกอร์ซ้ำ
UPDATE ที่ทริกเกอร์ทำกับตารางเดิมจะเรียกทริกเกอร์นั้นอีกครั้ง ให้ใช้ตัวป้องกัน (pg_trigger_depth()) หรือออกแบบอย่างระมัดระวัง
สรุปทบทวน
ทริกเกอร์ช่วยทำให้การตอบสนองต่อการเปลี่ยนแปลงรายแถวเป็นอัตโนมัติ
- ฟังก์ชันที่คืนค่า TRIGGER + CREATE TRIGGER
- BEFORE สำหรับการแก้ไขข้อมูล และ AFTER สำหรับผลข้างเคียง
- NEW/OLD สำหรับเข้าถึงข้อมูลแถว
- WHEN และ OF คอลัมน์สำหรับเลือกเฉพาะกรณี
แบบทดสอบสั้น ๆ
คุณต้องการอัปเดตคอลัมน์ updated_at โดยอัตโนมัติทุกครั้งที่แถวมีการเปลี่ยนแปลง ควรตั้งค่าทริกเกอร์แบบใด
คำถามที่พบบ่อย
บทเรียน “โครงสร้างทริกเกอร์: BEFORE/AFTER, FOR EACH ROW” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “โครงสร้างทริกเกอร์: BEFORE/AFTER, FOR EACH ROW” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “โครงสร้างทริกเกอร์: BEFORE/AFTER, FOR EACH ROW”
ทำความเข้าใจจังหวะการทำงานของทริกเกอร์ ระดับการทำงาน (ระดับแถวเทียบกับระดับคำสั่ง) และความหมายของ NEW กับ OLD ภายในฟังก์ชันทริกเกอร์ คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “โครงสร้างทริกเกอร์: BEFORE/AFTER, FOR EACH ROW” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม
ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- โครงสร้างทริกเกอร์: BEFORE/AFTER, FOR EACH ROW
- พื้นฐานฟังก์ชัน PL/pgSQL
- บล็อก DO และโค้ดนิรนาม
- การตรวจสอบตารางด้วยทริกเกอร์