"ตารางการเปลี่ยนแปลง" ใน Postgres คืออะไร


12

หน้าอธิบายว่ามีอะไรใหม่ใน Postgres 10กล่าวถึง "ตารางการเปลี่ยนผ่านสำหรับทริกเกอร์"

ตารางการเปลี่ยนแปลงสำหรับทริกเกอร์

คุณลักษณะนี้ทำให้AFTER STATEMENTทั้งสองเป็นประโยชน์และมีประสิทธิภาพโดยการเปิดเผยแถวที่เก่าและใหม่ในแบบสอบถาม ก่อนที่คุณสมบัตินี้AFTER STATEMENTทริกเกอร์จะไม่สามารถเข้าถึงสิ่งเหล่านี้ได้โดยตรงและการแก้ไขปัญหาคือไบแซนไทน์และมีประสิทธิภาพต่ำ สามารถเขียนลอจิกลอจิกจำนวนมากได้AFTER STATEMENTโดยหลีกเลี่ยงความจำเป็นในการสลับบริบทที่มีราคาแพงในแต่ละแถวที่จำเป็นสำหรับทริกเกอร์แต่ละแถว

ตารางการเปลี่ยนแปลงคืออะไร?

คำตอบ:


12

คุณรู้ว่ามีOLDและNEWตัวแปรบันทึกสำหรับFOR EACH ROWทริกเกอร์อย่างไร

ตารางการเปลี่ยนแปลงเป็นสิ่งที่FOR EACH STATEMENTเทียบเท่า เป็นตารางที่มีสิ่งอันดับเก่าและใหม่ดังนั้นทริกเกอร์ของคุณจึงสามารถเห็นสิ่งที่เปลี่ยนแปลงไป


9

ฉันชอบคำอธิบายคุณลักษณะของเครก ข้อมูลจำเพาะ SQL-2011 กำหนดไว้ในบริบทของทริกเกอร์ว่า"ชุดของแถวที่ถูกลบแทรกหรือแทนที่เรียกว่าตารางการเปลี่ยนแปลง" คำอธิบายที่คล้ายกันคือที่ระบุไว้ในเอกสารที่

ในขณะที่ตารางการเปลี่ยนแปลงสำหรับAFTERทริกเกอร์มีการระบุโดยใช้REFERENCINGข้อในวิธีมาตรฐานตัวแปรแถวที่ใช้ในFOR EACH ROWทริกเกอร์อาจไม่ได้ระบุไว้ในREFERENCINGข้อ พวกเขามีอยู่ในลักษณะที่ขึ้นอยู่กับภาษาที่เขียนฟังก์ชันทริกเกอร์ บางภาษาทำงานได้อย่างมีประสิทธิภาพราวกับมีREFERENCINGประโยคที่บรรจุอยู่OLD ROW AS OLD NEW ROW AS NEW.

เป็นหลักพวกเขาทำให้การเปลี่ยนแปลงทั้งหมดของคำสั่งพร้อมให้คุณซึ่งมีประโยชน์มาก สำหรับการอ้างอิง DDL ในการสร้างทริกเกอร์มีลักษณะเช่นนี้กับตารางการเปลี่ยน

REFERENCING OLD TABLE AS oldtable NEW TABLE AS newtable

คุณสามารถดูตัวอย่างที่นี่และที่นี่เป็นหนึ่งจากชุดทดสอบ ,

CREATE TABLE transition_table_base (id int PRIMARY KEY, val text);

CREATE FUNCTION transition_table_base_ins_func()
  RETURNS trigger
  LANGUAGE plpgsql
AS $$
DECLARE
  t text;
  l text;
BEGIN
  t = '';
  FOR l IN EXECUTE
           $q$
             EXPLAIN (TIMING off, COSTS off, VERBOSE on)
             SELECT * FROM newtable
           $q$ LOOP
    t = t || l || E'\n';
  END LOOP;

  RAISE INFO '%', t;
  RETURN new;
END;
$$;

CREATE TRIGGER transition_table_base_ins_trig
  AFTER INSERT ON transition_table_base
  REFERENCING OLD TABLE AS oldtable NEW TABLE AS newtable
  FOR EACH STATEMENT
  EXECUTE PROCEDURE transition_table_base_ins_func();

หมายเหตุเพิ่มเติมบางส่วน

  1. พวกมันใช้ได้เฉพาะกับAFTERทริกเกอร์
  2. ON CONFLICTพวกเขาใช้เวลาในสิ่งที่บัญชีเช่น

สิ่งสำคัญคือต้องชี้ให้เห็นว่าไม่สามารถใช้งานได้ใน PG 10ทั้งหมด มีจำนวนมากที่มีปัญหาเปิดกับตารางการเปลี่ยนแปลง ส่วนใหญ่มีแพทช์ มีการต่อสู้แบบประจัญบานซึ่งเป็นชนิดของกิจวัตรประจำวัน ดูเหมือนว่ามีคนยกของหนักขึ้น กระทู้แสดงให้เห็นว่าเราจะรู้ว่าในเร็ว ๆ นี้

ผู้เขียนตอบกลับ - ดูเหมือนว่าจะไปได้ดีอีกครั้ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.