กลับไปหน้าบทความ

อ่าน 8 นาที

ทริกเกอร์บันทึก

ใน ฐานข้อมูลเชิงสัมพันธ์ ท ริกเกอร์บันทึก หรือ ทริกเกอร์ประวัติ เป็นกลไกสำหรับการบันทึกข้อมูลเกี่ยวกับการเปลี่ยนแปลงที่เกิดขึ้นโดยอัตโนมัติ ไม่ว่าจะเป็นการแทรก การอัปเดต หรือการลบ...

ทริกเกอร์บันทึก

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

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

การแนะนำ

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

ตัวกระตุ้นการบันทึก (Log trigger)เป็นกลไกในการตรวจจับการเปลี่ยนแปลงโดยอัตโนมัติและบันทึกสถานะก่อนหน้าของข้อมูล

คำนิยาม

สมมติว่ามีตาราง หนึ่ง ที่เราต้องการตรวจสอบตาราง นี้ ประกอบด้วยคอลัมน์ ดังต่อไปนี้ :

Column1, Column2, ..., Columnn

คอลัมน์ นี้Column1ถือว่าเป็นคีย์ หลัก

คอลัมน์เหล่านี้ถูกกำหนดให้มีประเภทดังต่อไปนี้:

Type1, Type2, ..., Typen

Log Triggerทำงานโดยการบันทึกการเปลี่ยนแปลง ( การแทรกการอัปเดตและ การ ลบ ) บนตาราง หนึ่งไปยัง ตารางประวัติอีกตารางหนึ่งซึ่งกำหนดไว้ดังนี้:

สร้างตารางHistoryTable ( Column1 Type1 , Column2 Type2 , : : Columnn Typen ,วันที่เริ่มต้น(DATETIME) , วันที่สิ้นสุด(DATETIME )

ดังแสดงในภาพด้านบน ตารางใหม่นี้มีคอลัมน์ เหมือนกับ ตารางเดิมและเพิ่มเติมด้วยคอลัมน์ ใหม่สองคอลัมน์ ที่มีชนิด ข้อมูลเป็น DATETIME: StartDateและEndDateนี่เรียกว่าการกำหนดเวอร์ชันแบบทูเพิล (tuple versioning ) คอลัมน์เพิ่มเติมสองคอลัมน์นี้กำหนดช่วงเวลา "ความถูกต้อง" ของข้อมูลที่เกี่ยวข้องกับเอนทิตีที่ระบุ (เอนทิตีของคีย์หลัก ) หรือกล่าวอีกนัยหนึ่งคือ จะเก็บข้อมูลว่าข้อมูลเป็นอย่างไรในช่วงเวลาระหว่างStartDate(รวมอยู่) และEndDate(ไม่รวมอยู่)

สำหรับแต่ละเอนทิตี ( คีย์หลักที่ ไม่ซ้ำกัน ) ในตาราง ต้นฉบับ โครงสร้างต่อไปนี้จะถูกสร้างขึ้นในตาราง ประวัติ ข้อมูลแสดงเป็นเพียงตัวอย่าง

ตัวอย่าง
ตัวอย่าง

โปรดสังเกตว่า หากแสดงข้อมูลตามลำดับเวลาEndDateคอลัมน์ของแถว ใด ๆ จะเป็นคอลัมน์เดียวStartDateกับแถวถัดไป (ถ้ามี) นั่นไม่ได้หมายความว่าทั้งสองแถวนั้นเป็นข้อมูลเดียวกัน ณ จุดเวลาดังกล่าว เนื่องจากตามคำนิยามแล้ว ค่าของแถวถัดEndDateไปจะไม่ถูกรวมอยู่ด้วย

ทริกเกอร์ Logมีสองรูปแบบ ขึ้นอยู่กับว่าค่าเก่า (DELETE, UPDATE) และค่าใหม่ (INSERT, UPDATE) ถูกส่งไปยังทริกเกอร์อย่างไร (ขึ้นอยู่กับ RDBMS):

ค่าเก่าและค่าใหม่ในฐานะฟิลด์ของโครงสร้างข้อมูลบันทึก

สร้างทริกเกอร์HistoryTable บนOriginalTable สำหรับการแทรกลบ และอัปเดตโดย ประกาศ ตัวแปร@Now เป็น ประเภทวันที่และเวลาและกำหนดค่า @Now เป็นGETDATE ( )/* กำลังลบส่วน */อัปเดตตารางประวัติ (HistoryTable) โดยตั้งค่า EndDate เป็น@Now ในกรณีที่EndDate เป็นค่าว่างและColumn1 เท่ากับค่าเก่าColumn1/* แทรกส่วน */INSERT INTO HistoryTable ( Column1 , Column2 , ..., Columnn , StartDate , EndDate ) VALUES ( NEW . Column1 , NEW . Column2 , ..., NEW . Columnn , @ Now , NULL )

ค่าเก่าและค่าใหม่ในรูปแถวของตารางเสมือน

สร้างทริกเกอร์HistoryTable บนOriginalTable สำหรับการแทรกลบ และอัปเดตโดย ประกาศ ตัวแปร@Now เป็น ประเภทวันที่และเวลาและกำหนดค่า @Now เป็นGETDATE ( )/* กำลังลบส่วน */อัปเดตตารางประวัติ (HistoryTable) โดยตั้งค่าEndDate เป็น@ Now จากตารางประวัติ (HistoryTable ) ที่ถูกลบ (DELETED) โดยที่คอลัมน์ที่ 1 ของ ตารางประวัติ (HistoryTable.Column1 ) เท่ากับคอลัมน์ที่ 1 ของตารางประวัติ ( DELETED ) และEndDate ของตารางประวัติ (HistoryTable.EndDate ) เป็นค่าว่าง (NULL)/* แทรกส่วน */INSERT INTO HistoryTable ( Column1 , Column2 , ..., Columnn , StartDate , EndDate ) SELECT ( Column1 , Column2 , ..., Columnn , @ Now , NULL ) FROM INSERTED

หมายเหตุเกี่ยวกับความเข้ากันได้

โค้ดด้านบนแสดงเป็นตัวอย่างรูปแบบการเขียนโค้ด ไวยากรณ์ของทริกเกอร์จะแตกต่างกันอย่างมากใน ระบบจัดการฐานข้อมูลเชิง สัมพันธ์ (RDBMS)ตัวอย่างเช่น:

  • ฟังก์ชันนี้GetDate()ใช้สำหรับรับวันที่และเวลาของระบบ โดยระบบจัดการฐานข้อมูลเชิงสัมพันธ์(RDBMS) บางระบบ อาจใช้ชื่อฟังก์ชันอื่น หรือรับข้อมูลนี้ด้วยวิธีอื่นก็ได้
  • ระบบจัดการฐานข้อมูลเชิงสัมพันธ์ (RDBMS) หลายระบบ (เช่น Db2, MySQL) ไม่รองรับการใช้ทริกเกอร์เดียวกันกับมากกว่าหนึ่งการดำเนินการ ( INSERT , DELETE , UPDATE ) ในกรณีเช่นนี้ จะต้องสร้างทริกเกอร์สำหรับแต่ละการดำเนินการ สำหรับ การดำเนินการ INSERTจะต้องระบุเฉพาะส่วนการแทรก สำหรับการดำเนินการ DELETEจะต้องระบุเฉพาะส่วนการลบ และสำหรับการดำเนินการ UPDATEจะต้องระบุทั้งสองส่วน ดังที่แสดงไว้ข้างต้น ( ส่วนการลบก่อน แล้วตามด้วยส่วนการแทรก ) เนื่องจาก การดำเนินการ UPDATE นั้น โดยหลักการแล้วคือ การดำเนินการ DELETEตามด้วยการดำเนินการINSERT
  • ในโค้ดที่แสดงโครงสร้างข้อมูล บันทึก ที่มีค่าเก่าและค่าใหม่เรียกว่าOLDและ ตามลำดับ NEWในระบบจัดการฐานข้อมูลเชิงสัมพันธ์(RDBMS)บางระบบ ชื่อของโครงสร้างข้อมูลนี้อาจแตกต่างกันได้
  • ในโค้ดที่แสดง ตารางเสมือนมีชื่อว่าDELETEDและINSERTEDในระบบจัดการฐานข้อมูลเชิงสัมพันธ์(RDBMS)บางระบบ ชื่อของตารางเสมือนอาจแตกต่างกันไป บางระบบจัดการฐานข้อมูล (Db2) ยังอนุญาตให้ระบุชื่อของตารางเชิงตรรกะเหล่านี้ได้ด้วย
  • ในโค้ดที่แสดงอยู่นี้ คอมเมนต์เขียนในรูปแบบ C/C++ ซึ่งอาจไม่รองรับโดยRDBMS บางระบบ หรืออาจต้องใช้ไวยากรณ์ที่แตกต่างออกไป
  • ระบบจัดการฐานข้อมูล เชิงสัมพันธ์ (RDBMS)หลาย ระบบ กำหนดให้เนื้อหาของทริกเกอร์ต้องอยู่ระหว่างคำหลัก ` BEGINand` และ ` or`END

การนำไปใช้ในระบบจัดการฐานข้อมูลเชิงสัมพันธ์ทั่วไป(RDBMS)

แหล่งที่มา: [ 1 ]

  • ไม่สามารถแนบทริกเกอร์กับมากกว่าหนึ่งการดำเนินการ ( INSERT , DELETE , UPDATE ) ได้ ดังนั้นจึงต้องสร้างทริกเกอร์สำหรับแต่ละการดำเนินการ
  • ค่าเก่าและค่าใหม่จะถูกแสดงเป็นฟิลด์ของโครงสร้างข้อมูลเรคอร์ด ชื่อของเรคอร์ดเหล่านี้สามารถกำหนดได้ ในตัวอย่างนี้Oค่าเก่าจะถูกตั้งชื่อว่า และNค่าใหม่จะ ถูกตั้งชื่อว่า
-- ริกเกอร์สำหรับการแทรกข้อมูลCREATE TRIGGER Database.TableInsert AFTER INSERT ON Database.OriginalTable REFERENCING NEW AS N FOR EACH ROW MODE DB2SQL BEGIN DECLARE Now TIMESTAMP ; SET NOW = CURRENT TIMESTAMP ;INSERT INTO Database.HistoryTable ( Column1 , Column2 , ... , Columnn , StartDate , EndDate ) VALUES ( N.Column1 , N.Column2 , ... , N.Column , Now , NULL ) ; END ;-- ทริกเกอร์สำหรับการลบCREATE TRIGGER Database.TableDelete AFTER DELETE ON Database.OriginalTable REFERENCING OLD AS O FOR EACH ROW MODE DB2SQL BEGIN DECLARE Now TIMESTAMP ; SET NOW = CURRENT TIMESTAMP ;อัปเดตฐานข้อมูล. HistoryTable โดยตั้งค่า EndDate เป็นNow เมื่อColumn1 เท่ากับ0 และEndDate เป็นNULL ; END ;-- ริกเกอร์สำหรับการอัปเดCREATE TRIGGER Database.TableUpdate AFTER UPDATE ON Database.OriginalTable REFERENCING NEW AS N OLD AS O FOR EACH ROW MODE DB2SQL BEGIN DECLARE Now TIMESTAMP ; SET NOW = CURRENT TIMESTAMP ;อัปเดตฐานข้อมูล. HistoryTable โดยตั้งค่าEndDate เป็นNow เมื่อColumn1 = 0 และEndDate เป็นNULL ;INSERT INTO Database.HistoryTable ( Column1 , Column2 , ... , Columnn , StartDate , EndDate ) VALUES ( N.Column1 , N.Column2 , ... , N.Column , Now , NULL ) ; END ;

แหล่งที่มา: [ 2 ]

  • สามารถใช้ทริกเกอร์เดียวกันกับคำสั่งINSERT , DELETEและUPDATE ทั้งหมดได้
  • ค่าเก่าและค่าใหม่เป็นแถวของตารางเสมือนที่มีชื่อว่าDELETEDและINSERTED.
สร้างทริกเกอร์TableTrigger บนOriginalTable สำหรับการลบ การแทรก และการอัปเดตดังนี้ประกาศตัวแปร@NOW เป็นประเภท DateTime และกำหนดค่า@NOW เท่ากับCURRENT_TIMESTAMPอัปเดตตารางประวัติ (HistoryTable) โดยตั้งค่าวันสิ้นสุด (EndDate ) เป็น@ ปัจจุบันจากตารางประวัติ ( HistoryTable ) ที่ถูกลบ( DELETED ) โดยที่ColumnID ของตารางประวัติเท่ากับColumnID ของตารางประวัติที่ถูกลบ และวันสิ้นสุดของตารางประวัติเป็นค่าว่าง (NULL)INSERT INTO HistoryTable ( ColumnID , Column2 , ..., Columnn , StartDate , EndDate ) SELECT ColumnID , Column2 , ..., Columnn , @ NOW , NULL FROM INSERTED
  • ไม่สามารถแนบทริกเกอร์กับมากกว่าหนึ่งการดำเนินการ ( INSERT , DELETE , UPDATE ) ได้ ดังนั้นจึงต้องสร้างทริกเกอร์สำหรับแต่ละการดำเนินการ
  • ค่าเก่าและค่าใหม่จะถูกแสดงเป็นฟิลด์ของโครงสร้างข้อมูลเรคอร์ดที่เรียกว่าOldและNew
ตัวคั่น$$/* ทริกเกอร์สำหรับการแทรกข้อมูล */ CREATE TRIGGER HistoryTableInsert AFTER INSERT ON OriginalTable FOR EACH ROW BEGIN DECLARE N DATETIME ; SET N = now (); INSERT INTO HistoryTable ( Column1 , Column2 , ..., Columnn , StartDate , EndDate ) VALUES ( New . Column1 , New . Column2 , ..., New . Columnn , N , NULL ); END ;/* ทริกเกอร์สำหรับการลบ */ CREATE TRIGGER HistoryTableDelete AFTER DELETE ON OriginalTable FOR EACH ROW BEGIN DECLARE N DATETIME ; SET N = now (); UPDATE HistoryTable SET EndDate = N WHERE Column1 = OLD . Column1 AND EndDate IS NULL ; END ;/* ทริกเกอร์สำหรับการอัปเดต */ CREATE TRIGGER HistoryTableUpdate AFTER UPDATE ON OriginalTable FOR EACH ROW BEGIN DECLARE N DATETIME ; SET N = now ();อัปเดตตารางประวัติ (HistoryTable) โดยตั้งค่า EndDate เป็นN เมื่อColumn1 เท่ากับ ค่าเก่าของColumn1 และEndDate เป็นNULL ;INSERT INTO HistoryTable ( Column1 , Column2 , ..., Columnn , StartDate , EndDate ) VALUES ( New . Column1 , New . Column2 , ..., New . Columnn , N , NULL ); END ;
  • สามารถใช้ทริกเกอร์เดียวกันกับคำสั่งINSERT , DELETEและUPDATE ทั้งหมดได้
  • ค่าเก่าและค่าใหม่จะถูกแสดงเป็นฟิลด์ของโครงสร้างข้อมูลเรคอร์ดที่เรียกว่า:OLDและ:NEW
  • จำเป็นต้องตรวจสอบค่าว่างของฟิลด์ใน:NEWระเบียนที่กำหนดคีย์หลัก (เมื่อ ดำเนินการ ลบ ) เพื่อหลีกเลี่ยงการแทรกแถวใหม่ที่มีค่าว่างในทุกคอลัมน์
สร้างหรือแทนที่ทริกเกอร์TableTrigger หลังจากแทรกหรืออัปเดตหรือลบข้อมูลในOriginalTable สำหรับแต่ละแถวประกาศNow TIMESTAMP ; เริ่มต้นเลือกCURRENT_TIMESTAMP ลงในNow จากDual ;อัปเดตตารางประวัติ (HistoryTable) โดยตั้งค่าEndDate เป็นNow หากEndDate เป็นNULL และColumn1 เท่ากับค่าเก่าของColumn1 ;ถ้า: NEW.Column1 ไม่เป็นค่าว่างให้แทรกข้อมูลลงในตาราง HistoryTable โดย เก็บค่าต่อ ไปนี้: Column1 , Column2 , ... , Columnn , StartDate , EndDate และค่าต่อไปนี้: : NEW.Column1 , : NEW.Column2 , ... , : NEW.Column , Now , NULL จบเงื่อนไข; จบ;
  • การกระทำที่เชื่อมโยงกับทริกเกอร์จะต้องระบุเป็นฟังก์ชัน ดังนั้นจึงต้องกำหนดฟังก์ชันขึ้นมาก่อน
  • ค่าเก่าและค่าใหม่จะแสดงเป็นแถวของตารางเสมือนที่มีชื่อว่าold_tableและnew_tableแต่ชื่อเหล่านี้อาจแตกต่างกันได้
  • แม้ว่าทริกเกอร์หนึ่งตัวจะสามารถเชื่อมโยงกับการดำเนินการมากกว่าหนึ่งรายการ (INSERT, DELETE, UPDATE) ได้ แต่ในกรณีนี้ จะมีการเชื่อมโยงทริกเกอร์ที่แตกต่างกันกับการดำเนินการแต่ละรายการ เพื่อระบุชื่อของตารางเสมือน และทริกเกอร์เหล่านี้สามารถอ้างอิงถึงฟังก์ชันเดียวกันได้
สร้างหรือแทนที่ฟังก์ชันprocess_for_table () ที่ส่งคืนทริกเกอร์เป็น$$ ประกาศnow TIMESTAMP : = NOW (); เริ่มต้น--- ลบส่วนถ้า( TG_OP = ' UPDATE ' หรือTG_OP = ' DELETE ' ) แล้วอัปเดHistoricTable โดยตั้งค่าEndDate เป็นnow จากHistoricTable เป็นH โดยเชื่อมตารางเก่าเข้ากับH.ColumnID ที่HistoricTable.ColumnID เท่ากับH.ColumnID และHistoricTable.EndDate เป็นNULL ;--- การแทรกส่วนIF ( TG_OP = 'INSERT' OR TG_OP = 'UPDATE' ) THEN INSERT INTO HistoricTable SELECT ColumnID , Column2 , ..., Columnn , now , NULL FROM new_table ; END IF ; RETURN NULL ; END ; $$ LANGUAGE plpgsqlสร้างทริกเกอร์TriggerForTableInsert หลังจากแทรกข้อมูลลงในตาราง OriginalTable โดยอ้างอิงตารางใหม่เป็นnew_table สำหรับแต่ละคำสั่งให้เรียกใช้ฟังก์ชันprocess_for_table ();สร้างทริกเกอร์TriggerForTableUpdate หลังจากอัปเดตบนOriginalTable โดยอ้างอิงตารางเก่าเป็นold_table และตารางใหม่เป็นnew_table สำหรับแต่ละคำสั่งให้เรียกใช้ฟังก์ชันprocess_for_table ();สร้างทริกเกอร์TriggerForTableDelete หลังจากลบตารางOriginalTable โดยอ้างอิงตารางเก่าเป็นold_table สำหรับแต่ละคำสั่งให้เรียกใช้ฟังก์ชันprocess_for_table ();

ข้อมูลทางประวัติศาสตร์

โดยทั่วไปการสำรองข้อมูลฐานข้อมูลใช้เพื่อจัดเก็บและเรียกใช้ข้อมูลในอดีตการสำรองข้อมูลฐานข้อมูลเป็นกลไกด้านความปลอดภัยมากกว่าจะเป็นวิธีที่มีประสิทธิภาพในการเรียกใช้ข้อมูลในอดีตที่พร้อมใช้งาน

การสำรองข้อมูลฐานข้อมูล (แบบเต็ม) เป็นเพียงภาพรวมของข้อมูล ณ จุดเวลาใดเวลาหนึ่งเท่านั้น ดังนั้นเราจึงสามารถทราบข้อมูลของแต่ละภาพรวมได้ แต่เราไม่สามารถทราบข้อมูลใดๆ ระหว่างช่วงเวลาเหล่านั้นได้ ข้อมูลในการสำรองข้อมูลฐานข้อมูลนั้นเป็นข้อมูลที่แยกจากกันตามช่วงเวลา

การใช้ทริกเกอร์บันทึกทำให้ข้อมูลที่เราสามารถทราบได้ไม่ใช่ข้อมูลแบบไม่ต่อเนื่อง แต่เป็นข้อมูลต่อเนื่อง เราสามารถทราบสถานะที่แน่นอนของข้อมูล ณ จุดเวลาใดก็ได้ โดยมีข้อจำกัดเพียงแค่ระดับความละเอียดของเวลาที่กำหนดโดยDATETIMEชนิดข้อมูลของ ระบบจัดการฐานข้อมูลเชิง สัมพันธ์ (RDBMS)ที่ใช้เท่านั้น

ข้อดี

  • มันง่ายมาก
  • นี่ไม่ใช่ผลิตภัณฑ์เชิงพาณิชย์ แต่ทำงานร่วมกับคุณสมบัติที่มีอยู่ในระบบจัดการฐานข้อมูลเชิงสัมพันธ์ (RDBMS ) ทั่วไป
  • ระบบทำงานอัตโนมัติ เมื่อสร้างเสร็จแล้วก็จะทำงานโดยไม่ต้องมีการแทรกแซงจากมนุษย์อีกต่อไป
  • ไม่จำเป็นต้องมีความรู้เกี่ยวกับตารางในฐานข้อมูลหรือแบบจำลองข้อมูลเป็นอย่างดี
  • ไม่จำเป็นต้องเปลี่ยนแปลงโปรแกรมปัจจุบัน
  • ไม่จำเป็นต้องแก้ไขตาราง ปัจจุบัน เนื่องจากข้อมูลบันทึกของ ตาราง ใดๆ จะถูกจัดเก็บไว้ในตารางอื่น
  • ใช้งานได้ทั้งกับคำสั่งที่ตั้งโปรแกรมไว้ล่วงหน้าและคำสั่งที่กำหนดขึ้นเอง
  • เฉพาะการเปลี่ยนแปลง ( การแทรกการอัปเดตและ การ ลบ ) เท่านั้นที่จะถูกบันทึกไว้ ดังนั้นอัตราการเติบโตของตารางประวัติจึงเป็นสัดส่วนกับการเปลี่ยนแปลงเหล่านั้น
  • ไม่จำเป็นต้องใช้ทริกเกอร์กับทุกตารางในฐานข้อมูล สามารถใช้กับบางตารางหรือบางคอลัมน์ของตารางก็ได้

ข้อเสีย

  • ระบบจะไม่จัดเก็บข้อมูลเกี่ยวกับผู้ใช้ที่ทำการเปลี่ยนแปลงโดยอัตโนมัติ (ผู้ใช้ระบบสารสนเทศ ไม่ใช่ผู้ใช้ฐานข้อมูล) ข้อมูลนี้อาจต้องระบุอย่างชัดเจน สามารถบังคับใช้ได้ในระบบสารสนเทศ แต่ไม่สามารถบังคับใช้ได้ในการสืบค้นข้อมูลแบบเฉพาะกิจ

ตัวอย่างการใช้งาน

การดึงข้อมูลตารางเวอร์ชันปัจจุบัน

เลือกคอลัมน์ 1 , คอลัมน์ 2 , ..., คอลัมน์ n จากตารางประวัติโดยที่วันที่สิ้นสุดเป็นค่าว่าง

ควรส่งคืนชุดผลลัพธ์เดียวกันกับตาราง ต้นฉบับ ทั้งหมด

การรับข้อมูลตาราง ณ จุดเวลาใดเวลาหนึ่ง

สมมติว่า@DATEตัวแปรนั้นประกอบด้วยจุดหรือเวลาที่สนใจ

SELECT Column1 , Column2 , ..., Columnn FROM HistoryTable WHERE @ Date >= StartDate AND ( @ Date < EndDate OR EndDate IS NULL )

การรับข้อมูลของบุคคลหรือองค์กร ณ จุดเวลาใดเวลาหนึ่ง

สมมติว่า@DATEตัวแปรหนึ่งเก็บจุดหรือเวลาที่สนใจ และอีก@KEYตัวแปรหนึ่งเก็บคีย์หลักของเอนทิตีที่สนใจ

SELECT Column1 , Column2 , ..., Columnn FROM HistoryTable WHERE Column1 = @ Key AND @ Date >= StartDate AND ( @ Date < EndDate OR EndDate IS NULL )

การค้นหาประวัติความเป็นมาของหน่วยงาน

สมมติว่า@KEYตัวแปรนั้นเก็บค่าคีย์หลักของเอนทิตีที่เราสนใจ

เลือกColumn1 , Column2 , ..., Columnn , StartDate , EndDate จากHistoryTable โดยที่Column1 = @Key เรียงลำดับตามStartDate

การตรวจสอบเวลาและวิธีการสร้างเอนทิตี

สมมติว่า@KEYตัวแปรนั้นเก็บค่าคีย์หลักของเอนทิตีที่เราสนใจ

SELECT H2.Column1 , H2.Column2 , ... , H2.Column , H2.StartDate FROM HistoryTable AS H2 LEFT OUTER JOIN HistoryTable AS H1 ON H2.Column1 = H1.Column1 AND H2.Column1 = @Key AND H2.StartDate = H1.EndDate WHERE H2.EndDate IS NULL

ความไม่เปลี่ยนแปลงของคีย์หลัก

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

มีหลายวิธีที่จะทำให้คีย์หลักไม่เปลี่ยนแปลง หรือเพิ่มประสิทธิภาพให้สูงสุด:

  • การใช้คีย์สำรองเป็นคีย์หลักเนื่องจากไม่มีเหตุผลที่จะเปลี่ยนแปลงค่าที่ไม่มีความหมายอื่นใดนอกจากเอกลักษณ์และความเป็นเอกลักษณ์ ดังนั้นค่านี้จึงไม่มีวันเปลี่ยนแปลง
  • การใช้คีย์ธรรมชาติ ที่ไม่สามารถเปลี่ยนแปลงได้ เป็นคีย์หลักในการออกแบบฐานข้อมูล ที่ดี คีย์ธรรมชาติที่สามารถเปลี่ยนแปลงได้ไม่ควรถูกพิจารณาว่าเป็นคีย์หลัก "ที่แท้จริง "
  • การใช้คีย์ธรรมชาติ ที่เปลี่ยนแปลงได้ เป็นคีย์หลัก (ซึ่งไม่แนะนำอย่างยิ่ง) ในกรณีที่การเปลี่ยนแปลงจะถูกส่งต่อไปยังทุกที่ที่ใช้เป็นคีย์ต่างประเทศในกรณีเช่นนี้ ตารางประวัติการเปลี่ยนแปลงก็ควรได้รับผลกระทบด้วยเช่นกัน

ตามระเบียบวิธีบริหารจัดการมิติที่เปลี่ยนแปลงอย่างช้าๆตัวกระตุ้นการบันทึกข้อมูลจัดอยู่ในประเภทดังต่อไปนี้:

ดูเพิ่มเติม

หมายเหตุ

ตัวกระตุ้นบันทึกได้รับการออกแบบโดยLaurence R. Ugalde [ 3 ]เพื่อสร้างประวัติของฐานข้อมูลธุรกรรมโดยอัตโนมัติ

ตัวกระตุ้นบันทึกบนGitHub

ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Log_trigger&oldid=1334977148 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ ทริกเกอร์บันทึก

ใน ฐานข้อมูลเชิงสัมพันธ์ ท ริกเกอร์บันทึก หรือ ทริกเกอร์ประวัติ เป็นกลไกสำหรับการบันทึกข้อมูลเกี่ยวกับการเปลี่ยนแปลงที่เกิดขึ้นโดยอัตโนมัติ ไม่ว่าจะเป็นการแทรก การอัปเดต หรือการลบ...

การแนะนำ

ฐานข้อมูลเชิงปฏิบัติการมักถูกออกแบบมาเพื่อบันทึกสถานะปัจจุบันขององค์กร ทำหน้าที่เป็นภาพรวมของ "ปัจจุบัน" มากกว่าจะเป็นคลังข้อมูลทางประวัติศาสตร์ ในสภาพแวดล้อมเช่นนี้ การอัปเดตมักเป็นการทำลายข้อมูลเดิม เมื่อจุดข้อมูลเฉพาะเปลี่ยนแปลง...

คำนิยาม

สมมติว่ามี ตาราง หนึ่ง ที่เราต้องการตรวจสอบ ตาราง นี้ ประกอบด้วย คอลัมน์ ดังต่อไปนี้ :

หมายเหตุเกี่ยวกับความเข้ากันได้

โค้ดด้านบนแสดงเป็นตัวอย่าง รูปแบบการเขียน โค้ด ไวยากรณ์ของทริกเกอร์จะแตกต่างกันอย่างมากใน ระบบจัดการฐานข้อมูลเชิง สัมพันธ์ (RDBMS) ตัวอย่างเช่น: