สาเหตุที่เป็นไปได้มากที่สุดของข้อผิดพลาดของตารางกลายพันธุ์คือการใช้ทริกเกอร์ในทางที่ผิด นี่คือตัวอย่างทั่วไป:
- คุณแทรกแถวในตาราง A
- ทริกเกอร์ในตาราง A (สำหรับแต่ละแถว) เรียกใช้งานแบบสอบถามบนตาราง A ตัวอย่างเช่นเพื่อคำนวณคอลัมน์สรุป
- Oracle ส่ง ORA-04091: ตาราง A กำลังกลายพันธุ์ทริกเกอร์ / ฟังก์ชั่นอาจไม่เห็น
นี่เป็นพฤติกรรมที่คาดหวังและเป็นเรื่องปกติ Oracle ต้องการปกป้องคุณจากตัวคุณเองตั้งแต่ Oracle รับประกัน:
- (i) ว่าแต่ละคำสั่งคืออะตอม (กล่าวคือจะล้มเหลวหรือประสบความสำเร็จอย่างสมบูรณ์)
- (ii) ว่าแต่ละคำสั่งเห็นมุมมองที่สอดคล้องกันของข้อมูล
มีแนวโน้มมากที่สุดเมื่อคุณเขียนทริกเกอร์ประเภทนี้คุณจะคาดหวังว่าแบบสอบถาม (2) จะเห็นแถวแทรกใน (1) สิ่งนี้อาจขัดแย้งกับจุดทั้งสองข้างต้นเนื่องจากการอัปเดตยังไม่เสร็จ (อาจมีการแทรกแถวเพิ่มเติม)
Oracle สามารถส่งคืนผลลัพธ์ที่สอดคล้องกับจุดก่อนเวลาเริ่มต้นของคำชี้แจง แต่จากตัวอย่างส่วนใหญ่ที่ฉันเห็นว่าพยายามใช้ตรรกะนี้ผู้คนเห็นคำสั่งหลายแถวเป็นชุดของขั้นตอนต่อเนื่องและคาดว่า คำสั่ง [2] เพื่อดูการเปลี่ยนแปลงที่ทำโดยขั้นตอนก่อนหน้า Oracle ไม่สามารถส่งคืนผลลัพธ์ที่คาดไว้ดังนั้นจึงเกิดข้อผิดพลาด
สำหรับการอ่านเพิ่มเติม: "กรรมวิธีตาราง" บนถามทอม
ถ้าอย่างที่ฉันสงสัยว่าสาเหตุของข้อผิดพลาดในการกลายพันธุ์เป็นทริกเกอร์วิธีหนึ่งที่จะหลีกเลี่ยงข้อผิดพลาดคือการย้ายลอจิกออกจากทริกเกอร์ไปยังขั้นตอน