0Pricing
SQL Academy · บทเรียน

โครงสร้างทริกเกอร์: 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. โครงสร้างทริกเกอร์: BEFORE/AFTER, FOR EACH ROW
  2. พื้นฐานฟังก์ชัน PL/pgSQL
  3. บล็อก DO และโค้ดนิรนาม
  4. การตรวจสอบตารางด้วยทริกเกอร์
← กลับไปที่ SQL Academy