อะไรคือสาเหตุและวิธีแก้ไขการกลายพันธุ์ข้อผิดพลาดของตาราง?


12

ฉันเข้าใจว่าการกลายพันธุ์ข้อผิดพลาดของตารางเกิดจากข้อบกพร่องในการออกแบบหรือแบบสอบถามที่มีปัญหา

แบบสอบถามเก่าถูกนำไปผลิตเมื่อเร็ว ๆ นี้ซึ่งทำให้เกิดข้อผิดพลาดของการกลายพันธุ์ของตาราง DBA ของเราแก้ไขปัญหาได้ แต่เราไม่รู้วิธีการ

อะไรทำให้เกิดข้อผิดพลาดในการกลายพันธุ์ของตารางและ DBA ของเราจะแก้ไขปัญหาอย่างไร

คำตอบ:


17

สาเหตุที่เป็นไปได้มากที่สุดของข้อผิดพลาดของตารางกลายพันธุ์คือการใช้ทริกเกอร์ในทางที่ผิด นี่คือตัวอย่างทั่วไป:

  1. คุณแทรกแถวในตาราง A
  2. ทริกเกอร์ในตาราง A (สำหรับแต่ละแถว) เรียกใช้งานแบบสอบถามบนตาราง A ตัวอย่างเช่นเพื่อคำนวณคอลัมน์สรุป
  3. Oracle ส่ง ORA-04091: ตาราง A กำลังกลายพันธุ์ทริกเกอร์ / ฟังก์ชั่นอาจไม่เห็น

นี่เป็นพฤติกรรมที่คาดหวังและเป็นเรื่องปกติ Oracle ต้องการปกป้องคุณจากตัวคุณเองตั้งแต่ Oracle รับประกัน:

  • (i) ว่าแต่ละคำสั่งคืออะตอม (กล่าวคือจะล้มเหลวหรือประสบความสำเร็จอย่างสมบูรณ์)
  • (ii) ว่าแต่ละคำสั่งเห็นมุมมองที่สอดคล้องกันของข้อมูล

มีแนวโน้มมากที่สุดเมื่อคุณเขียนทริกเกอร์ประเภทนี้คุณจะคาดหวังว่าแบบสอบถาม (2) จะเห็นแถวแทรกใน (1) สิ่งนี้อาจขัดแย้งกับจุดทั้งสองข้างต้นเนื่องจากการอัปเดตยังไม่เสร็จ (อาจมีการแทรกแถวเพิ่มเติม)

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

สำหรับการอ่านเพิ่มเติม: "กรรมวิธีตาราง" บนถามทอม

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


9

ตารางกรรมวิธีเกิดขึ้นเมื่อคำสั่งที่ทำให้เกิดทริกเกอร์ในการดับเพลิงและการอ้างอิงไกตารางที่ทำให้เกิดทริกเกอร์ วิธีที่ดีที่สุดในการหลีกเลี่ยงปัญหาดังกล่าวคือไม่ใช้ทริกเกอร์ แต่ฉันสงสัยว่า DBA ไม่ได้ใช้เวลาในการทำเช่นนั้น เขาสามารถทำอย่างใดอย่างหนึ่งต่อไปนี้:

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

1
อย่างน้อยสำหรับฉันการเปลี่ยนเป็นทริกเกอร์หลังจากนั้นล้มเหลวใน 11.2.0.4.0
Software Prophets

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