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

VIEW ที่อัปเดตได้และทริกเกอร์ INSTEAD OF

ทำให้ VIEW อัปเดตได้โดยตรง หรือใช้ทริกเกอร์ INSTEAD OF เมื่อ VIEW รวมข้อมูลหรือเชื่อมตาราง

VIEW ที่อัปเดตได้และทริกเกอร์ INSTEAD OF เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน

มุมมองที่อัปเดตได้โดยอัตโนมัติ

PostgreSQL ทำให้มุมมองแบบง่ายอัปเดตได้โดยอัตโนมัติ การ INSERT/UPDATE/DELETE บนมุมมองจะถูกเขียนใหม่ให้เป็นการดำเนินการเดียวกันบนตารางฐาน:

CREATE VIEW active_users AS
  SELECT id, email, full_name FROM users WHERE deleted_at IS NULL;

UPDATE active_users SET full_name = 'Alice' WHERE id = 1;
-- Translates to UPDATE on the users table.

ข้อกำหนดสำหรับการอัปเดตอัตโนมัติ

มุมมองต้องมีคุณสมบัติดังนี้:

  • อ้างอิงตารางฐาน exactly ONE ตาราง
  • ไม่มีการรวมผลลัพธ์, GROUP BY, HAVING หรือ DISTINCT
  • ไม่มี LIMIT หรือ OFFSET
  • ไม่มีการดำเนินการแบบเซต เช่น UNION
  • จับคู่คอลัมน์โดยตรง (ไม่มีนิพจน์ในรายการ SELECT — หรือมีเพียงบางส่วน)

WITH CHECK OPTION

ห้ามการเขียนที่ทำให้เกิดแถวซึ่งมองไม่เห็นจากมุมมอง:

CREATE VIEW active_users AS
  SELECT * FROM users WHERE deleted_at IS NULL
  WITH CHECK OPTION;

INSERT INTO active_users (email, deleted_at) VALUES (..., NOW());
-- ERROR — would create a row outside the view's WHERE.

มุมมองซับซ้อนต้องใช้ INSTEAD OF

มุมมองที่มีการรวมตาราง การรวมผลลัพธ์ หรือนิพจน์ จะไม่อัปเดตได้โดยอัตโนมัติ คุณต้องเขียนทริกเกอร์ INSTEAD OF เพื่อกำหนดความหมายของการเขียนข้อมูล:

CREATE VIEW user_with_address AS
  SELECT u.id, u.email, a.city, a.country
  FROM users u JOIN addresses a ON a.user_id = u.id;

CREATE TRIGGER user_addr_update
INSTEAD OF UPDATE ON user_with_address
FOR EACH ROW EXECUTE FUNCTION update_user_addr();

ฟังก์ชันทริกเกอร์ INSTEAD OF

ฟังก์ชันจะตัดสินใจว่าควรเขียนข้อมูลลงในตารางฐานใด:

CREATE FUNCTION update_user_addr() RETURNS TRIGGER AS $$
BEGIN
  UPDATE users SET email = NEW.email WHERE id = NEW.id;
  UPDATE addresses SET city = NEW.city, country = NEW.country WHERE user_id = NEW.id;
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

เมื่อ INSTEAD OF เหมาะกว่าตรรกะในแอป

หากมีผู้ใช้หลายกลุ่มอัปเดตมุมมอง การรวมตรรกะการอัปเดตไว้ในทริกเกอร์จะช่วยให้มีความสอดคล้องกัน หากมีแอปเดียวที่อัปเดต ให้เก็บตรรกะไว้ในโค้ดของแอป

SECURITY BARRIER

ป้องกันไม่ให้ตัววางแผนเผยแพร่ predicate ไปยังผู้ใช้มุมมองที่ไม่น่าเชื่อถือ ซึ่งอาจทำให้ข้อมูลรั่วไหลผ่านต้นทุน:

CREATE VIEW my_things AS
SELECT * FROM things WHERE owner_id = current_user_id()
WITH (security_barrier);

ความปลอดภัยระดับแถวเป็นทางเลือก

PostgreSQL สมัยใหม่ยังรองรับความปลอดภัยระดับแถว (RLS) บนตารางฐานด้วย ซึ่งมักสะอาดกว่าการสร้างมุมมองเพื่อความปลอดภัย

ALTER TABLE things ENABLE ROW LEVEL SECURITY;
CREATE POLICY owner_only ON things USING (owner_id = current_user_id());

มุมมองแบบเรียกซ้ำ

PostgreSQL รองรับมุมมองแบบเรียกซ้ำ ซึ่งช่วยให้คุณสอบถามลำดับชั้นได้:

CREATE RECURSIVE VIEW tree (id, parent_id, depth) AS
  SELECT id, parent_id, 0 FROM nodes WHERE parent_id IS NULL
  UNION ALL
  SELECT n.id, n.parent_id, t.depth + 1
  FROM nodes n JOIN tree t ON n.parent_id = t.id;

สิทธิ์

มอบสิทธิ์บนมุมมอง ไม่ใช่ตารางฐาน:

GRANT SELECT, UPDATE ON active_users TO app_user;

หมายเหตุด้านประสิทธิภาพ

ทริกเกอร์ INSTEAD OF ทำงานหนึ่งครั้งต่อแถว จึงช้าสำหรับ DML จำนวนมาก โดยทั่วไปให้ผู้เรียกเขียนข้อมูลลงตารางฐานโดยตรงจะดีกว่า

สรุป

มุมมองสามารถเขียนข้อมูลได้

  • มุมมองแบบง่าย: อัปเดตได้โดยอัตโนมัติ
  • มุมมองซับซ้อน: ใช้ทริกเกอร์ INSTEAD OF
  • WITH CHECK OPTION บังคับใช้เงื่อนไขการมองเห็น
  • RLS มักเป็นรูปแบบการรักษาความปลอดภัยที่สะอาดกว่า

ตรวจสอบอย่างรวดเร็ว

คุณกำหนดมุมมองที่รวมสองตารางเข้าด้วยกัน ตามค่าเริ่มต้นแล้ว คุณสามารถ UPDATE ผ่านมุมมองนี้ได้หรือไม่?

คำถามที่พบบ่อย

บทเรียน “VIEW ที่อัปเดตได้และทริกเกอร์ INSTEAD OF” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “VIEW ที่อัปเดตได้และทริกเกอร์ INSTEAD OF” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “VIEW ที่อัปเดตได้และทริกเกอร์ INSTEAD OF”

ทำให้ VIEW อัปเดตได้โดยตรง หรือใช้ทริกเกอร์ INSTEAD OF เมื่อ VIEW รวมข้อมูลหรือเชื่อมตาราง คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “VIEW ที่อัปเดตได้และทริกเกอร์ INSTEAD OF” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม

ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. VIEW แบบธรรมดา: การใช้ตรรกะซ้ำ
  2. VIEW ที่อัปเดตได้และทริกเกอร์ INSTEAD OF
  3. VIEW ที่จัดเก็บผลลัพธ์และกลยุทธ์ REFRESH
  4. เมื่อใดควรรวมข้อมูลล่วงหน้า
← กลับไปที่ SQL Academy