ใน Oracle เป็นไปได้หรือไม่ที่จะ INSERT หรือ UPDATE บันทึกผ่านมุมมอง?

ใน Oracle เป็นไปได้หรือไม่ที่จะ INSERT หรือ UPDATE บันทึก (แถว) ผ่านมุมมอง?


person Bastien Vandamme    schedule 31.10.2009    source แหล่งที่มา
comment
ฉันหมายถึงบันทึก ฉันแก้ไขคำถาม   -  person Bastien Vandamme    schedule 31.10.2009


คำตอบ (4)


มุมมองใน Oracle อาจ สามารถอัปเดตได้ภายใต้เงื่อนไขเฉพาะ อาจเป็นเรื่องยุ่งยาก และไม่แนะนำให้โดยปกติ

จากการอ้างอิง Oracle 10g SQL:

หมายเหตุเกี่ยวกับมุมมองที่อัปเดตได้

มุมมองที่อัปเดตได้คือมุมมองที่คุณสามารถใช้เพื่อแทรก อัปเดต หรือลบแถวของตารางฐานได้ คุณสามารถสร้างมุมมองเพื่อให้สามารถอัปเดตได้โดยธรรมชาติ หรือคุณสามารถสร้างทริกเกอร์ INSTEAD OF บนมุมมองใดก็ได้เพื่อให้สามารถอัปเดตได้

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

  • แต่ละคอลัมน์ในมุมมองต้องแมปกับคอลัมน์ของตารางเดียว ตัวอย่างเช่น หากคอลัมน์มุมมองแม็ปกับเอาต์พุตของส่วนคำสั่ง TABLE (คอลเล็กชันที่ไม่ถูกซ้อนกัน) มุมมองนั้นจะไม่สามารถอัปเดตได้โดยธรรมชาติ
  • The view must not contain any of the following constructs:
    • A set operator
    • ตัวดำเนินการที่แตกต่าง
    • ฟังก์ชันการรวมหรือการวิเคราะห์
    • จัดกลุ่มตาม, เรียงลำดับตาม, รุ่น, เชื่อมต่อโดยหรือเริ่มต้นด้วยส่วนคำสั่ง
    • นิพจน์คอลเลกชันในรายการ SELECT
    • แบบสอบถามย่อยในรายการ SELECT
    • แบบสอบถามย่อยที่กำหนดให้อ่านอย่างเดียว
    • เข้าร่วม โดยมีข้อยกเว้นบางประการ ตามที่ระบุไว้ในคู่มือผู้ดูแลระบบฐานข้อมูล Oracle

นอกจากนี้ หากมุมมองที่สามารถอัพเดตได้โดยเนื้อแท้มีคอลัมน์เทียมหรือนิพจน์ คุณจะไม่สามารถอัพเดตแถวตารางฐานด้วยคำสั่ง UPDATE ที่อ้างอิงถึงคอลัมน์เทียมหรือนิพจน์ใดๆ เหล่านี้ได้

หากคุณต้องการให้มุมมองการรวมสามารถอัปเดตได้ เงื่อนไขต่อไปนี้ทั้งหมดจะต้องเป็นจริง:

  • คำสั่ง DML ต้องมีผลกับตารางเดียวเท่านั้นที่อยู่ภายใต้การรวม
  • สำหรับคำสั่ง INSERT ต้องไม่สร้างมุมมองด้วย CHECK OPTION และคอลัมน์ทั้งหมดที่มีการแทรกค่าจะต้องมาจากตารางที่สงวนคีย์ไว้ ตารางที่เก็บรักษาคีย์คือตารางที่คีย์หลักหรือค่าคีย์เฉพาะทุกรายการในตารางฐานจะไม่ซ้ำกันในมุมมองการรวม
  • สำหรับคำสั่ง UPDATE คอลัมน์ทั้งหมดที่อัปเดตจะต้องแยกออกจากตารางที่เก็บรักษาคีย์ หากมุมมองถูกสร้างขึ้นด้วยตัวเลือกการตรวจสอบ ดังนั้นการรวมคอลัมน์และคอลัมน์ที่นำมาจากตารางที่มีการอ้างอิงมากกว่าหนึ่งครั้งในมุมมองจะต้องได้รับการป้องกันจาก UPDATE
  • สำหรับคำสั่ง DELETE หากการรวมส่งผลให้มีตารางที่เก็บรักษาคีย์ไว้มากกว่าหนึ่งตาราง Oracle Database จะลบออกจากตารางแรกที่มีชื่อในส่วนคำสั่ง FROM ไม่ว่ามุมมองจะถูกสร้างขึ้นด้วยตัวเลือกการตรวจสอบหรือไม่ก็ตาม
person DCookie    schedule 31.10.2009

Oracle มีสองวิธีที่แตกต่างกันในการทำให้มุมมองสามารถอัพเดตได้:-

  1. มุมมองคือ "คีย์ที่เก็บรักษาไว้" ที่เกี่ยวข้องกับสิ่งที่คุณพยายามอัปเดต ซึ่งหมายความว่าคีย์หลักของตารางที่ซ่อนอยู่จะอยู่ในมุมมอง และแถวจะปรากฏเพียงครั้งเดียวในมุมมอง ซึ่งหมายความว่า Oracle สามารถระบุได้อย่างชัดเจนว่าแถวของตารางที่ซ่อนอยู่ใดที่จะอัพเดต OR
  2. คุณเขียนแทนทริกเกอร์

ฉันจะอยู่ห่างจากทริกเกอร์แทนและรับโค้ดของคุณเพื่ออัปเดตตารางพื้นฐานโดยตรงแทนที่จะผ่านมุมมอง

person WW.    schedule 31.10.2009
comment
มี and หรือ or ระหว่างสองเงื่อนไขนี้หรือไม่ (สำหรับฉันมันดูเหมือนเป็นสองความคิดที่แยกจากกัน .. - person Thorsten; 02.11.2009

มีสองครั้งที่คุณสามารถอัปเดตเรกคอร์ดผ่านมุมมองได้:

  1. ถ้ามุมมองไม่มีการเรียกการรวมหรือการเรียกขั้นตอนและเลือกข้อมูลจากตารางพื้นฐานตารางเดียว
  2. หากมุมมองมี ทริกเกอร์ INSTEAD OF INSERT เชื่อมโยงกับมุมมอง

โดยทั่วไป คุณไม่ควรพึ่งพาความสามารถในการแทรกมุมมอง เว้นแต่คุณจะเขียนทริกเกอร์ INSTEAD OF ไว้เป็นการเฉพาะ โปรดทราบว่ายังมีทริกเกอร์ INSTEAD OF UPDATE ที่สามารถเขียนได้เช่นกันเพื่อช่วยดำเนินการอัปเดต

person LBushkin    schedule 31.10.2009
comment
ส่วนใหญ่เป็นจริง แต่สามารถอัปเดตมุมมองการรวมได้ในบางกรณี - person DCookie; 31.10.2009

ใช่ คุณสามารถอัปเดตและแทรกลงในมุมมองได้ และการแก้ไขนั้นจะสะท้อนให้เห็นในตารางต้นฉบับ....
แต่
1- มุมมองควรมีค่า NOT NULL ทั้งหมดบนตาราง
2-การอัปเดตควรมี กฎเดียวกันกับตาราง... "กำลังอัปเดตคีย์หลัก ที่เกี่ยวข้องกับคีย์ต่างประเทศอื่น ๆ .. ฯลฯ "...

person Radi Soufan    schedule 23.05.2015