อ่าน 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ความไม่เปลี่ยนแปลงของคีย์หลัก
เนื่องจากทริกเกอร์ต้องการให้คีย์หลักคงที่ตลอดเวลา จึงควรตรวจสอบให้แน่ใจหรือเพิ่มความคงที่ของคีย์หลักให้มากที่สุด หาก คีย์หลัก เปลี่ยนค่า ข้อมูลที่ คีย์หลัก นั้นแสดงถึงก็จะเสียหายไปด้วย
มีหลายวิธีที่จะทำให้คีย์หลักไม่เปลี่ยนแปลง หรือเพิ่มประสิทธิภาพให้สูงสุด:
- การใช้คีย์สำรองเป็นคีย์หลักเนื่องจากไม่มีเหตุผลที่จะเปลี่ยนแปลงค่าที่ไม่มีความหมายอื่นใดนอกจากเอกลักษณ์และความเป็นเอกลักษณ์ ดังนั้นค่านี้จึงไม่มีวันเปลี่ยนแปลง
- การใช้คีย์ธรรมชาติ ที่ไม่สามารถเปลี่ยนแปลงได้ เป็นคีย์หลักในการออกแบบฐานข้อมูล ที่ดี คีย์ธรรมชาติที่สามารถเปลี่ยนแปลงได้ไม่ควรถูกพิจารณาว่าเป็นคีย์หลัก "ที่แท้จริง "
- การใช้คีย์ธรรมชาติ ที่เปลี่ยนแปลงได้ เป็นคีย์หลัก (ซึ่งไม่แนะนำอย่างยิ่ง) ในกรณีที่การเปลี่ยนแปลงจะถูกส่งต่อไปยังทุกที่ที่ใช้เป็นคีย์ต่างประเทศในกรณีเช่นนี้ ตารางประวัติการเปลี่ยนแปลงก็ควรได้รับผลกระทบด้วยเช่นกัน
ตามระเบียบวิธีบริหารจัดการมิติที่เปลี่ยนแปลงอย่างช้าๆตัวกระตุ้นการบันทึกข้อมูลจัดอยู่ในประเภทดังต่อไปนี้:
- ประเภทที่ 2 ( รูปแบบการกำหนด เวอร์ชันทูเพิล )
- ประเภทที่ 4 (การใช้ตารางประวัติ)
ดูเพิ่มเติม
- ฐานข้อมูลเชิงสัมพันธ์
- คีย์หลัก
- กุญแจธรรมชาติ
- คีย์ตัวแทน
- การบันทึกข้อมูลการเปลี่ยนแปลง
- มิติที่ค่อยๆ เปลี่ยนแปลง
- การกำหนดเวอร์ชันทูเปิล
หมายเหตุ
ตัวกระตุ้นบันทึกได้รับการออกแบบโดยLaurence R. Ugalde [ 3 ]เพื่อสร้างประวัติของฐานข้อมูลธุรกรรมโดยอัตโนมัติ
ลิงก์ภายนอก
ตัวกระตุ้นบันทึกบนGitHub
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ ทริกเกอร์บันทึก
ใน ฐานข้อมูลเชิงสัมพันธ์ ท ริกเกอร์บันทึก หรือ ทริกเกอร์ประวัติ เป็นกลไกสำหรับการบันทึกข้อมูลเกี่ยวกับการเปลี่ยนแปลงที่เกิดขึ้นโดยอัตโนมัติ ไม่ว่าจะเป็นการแทรก การอัปเดต หรือการลบ...
การแนะนำ
ฐานข้อมูลเชิงปฏิบัติการมักถูกออกแบบมาเพื่อบันทึกสถานะปัจจุบันขององค์กร ทำหน้าที่เป็นภาพรวมของ "ปัจจุบัน" มากกว่าจะเป็นคลังข้อมูลทางประวัติศาสตร์ ในสภาพแวดล้อมเช่นนี้ การอัปเดตมักเป็นการทำลายข้อมูลเดิม เมื่อจุดข้อมูลเฉพาะเปลี่ยนแปลง...
คำนิยาม
สมมติว่ามี ตาราง หนึ่ง ที่เราต้องการตรวจสอบ ตาราง นี้ ประกอบด้วย คอลัมน์ ดังต่อไปนี้ :
หมายเหตุเกี่ยวกับความเข้ากันได้
โค้ดด้านบนแสดงเป็นตัวอย่าง รูปแบบการเขียน โค้ด ไวยากรณ์ของทริกเกอร์จะแตกต่างกันอย่างมากใน ระบบจัดการฐานข้อมูลเชิง สัมพันธ์ (RDBMS) ตัวอย่างเช่น: