ใน Oracle เป็นไปได้หรือไม่ที่จะ INSERT หรือ UPDATE บันทึก (แถว) ผ่านมุมมอง?
ใน Oracle เป็นไปได้หรือไม่ที่จะ INSERT หรือ UPDATE บันทึกผ่านมุมมอง?
คำตอบ (4)
มุมมองใน Oracle อาจ สามารถอัปเดตได้ภายใต้เงื่อนไขเฉพาะ อาจเป็นเรื่องยุ่งยาก และไม่แนะนำให้โดยปกติ
หมายเหตุเกี่ยวกับมุมมองที่อัปเดตได้
มุมมองที่อัปเดตได้คือมุมมองที่คุณสามารถใช้เพื่อแทรก อัปเดต หรือลบแถวของตารางฐานได้ คุณสามารถสร้างมุมมองเพื่อให้สามารถอัปเดตได้โดยธรรมชาติ หรือคุณสามารถสร้างทริกเกอร์ 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 ไม่ว่ามุมมองจะถูกสร้างขึ้นด้วยตัวเลือกการตรวจสอบหรือไม่ก็ตาม
Oracle มีสองวิธีที่แตกต่างกันในการทำให้มุมมองสามารถอัพเดตได้:-
- มุมมองคือ "คีย์ที่เก็บรักษาไว้" ที่เกี่ยวข้องกับสิ่งที่คุณพยายามอัปเดต ซึ่งหมายความว่าคีย์หลักของตารางที่ซ่อนอยู่จะอยู่ในมุมมอง และแถวจะปรากฏเพียงครั้งเดียวในมุมมอง ซึ่งหมายความว่า Oracle สามารถระบุได้อย่างชัดเจนว่าแถวของตารางที่ซ่อนอยู่ใดที่จะอัพเดต OR
- คุณเขียนแทนทริกเกอร์
ฉันจะอยู่ห่างจากทริกเกอร์แทนและรับโค้ดของคุณเพื่ออัปเดตตารางพื้นฐานโดยตรงแทนที่จะผ่านมุมมอง
and
หรือ or
ระหว่างสองเงื่อนไขนี้หรือไม่ (สำหรับฉันมันดูเหมือนเป็นสองความคิดที่แยกจากกัน ..
- person Thorsten; 02.11.2009
มีสองครั้งที่คุณสามารถอัปเดตเรกคอร์ดผ่านมุมมองได้:
- ถ้ามุมมองไม่มีการเรียกการรวมหรือการเรียกขั้นตอนและเลือกข้อมูลจากตารางพื้นฐานตารางเดียว
- หากมุมมองมี ทริกเกอร์ INSTEAD OF INSERT เชื่อมโยงกับมุมมอง
โดยทั่วไป คุณไม่ควรพึ่งพาความสามารถในการแทรกมุมมอง เว้นแต่คุณจะเขียนทริกเกอร์ INSTEAD OF ไว้เป็นการเฉพาะ โปรดทราบว่ายังมีทริกเกอร์ INSTEAD OF UPDATE ที่สามารถเขียนได้เช่นกันเพื่อช่วยดำเนินการอัปเดต
ใช่ คุณสามารถอัปเดตและแทรกลงในมุมมองได้ และการแก้ไขนั้นจะสะท้อนให้เห็นในตารางต้นฉบับ....
แต่
1- มุมมองควรมีค่า NOT NULL ทั้งหมดบนตาราง
2-การอัปเดตควรมี กฎเดียวกันกับตาราง... "กำลังอัปเดตคีย์หลัก ที่เกี่ยวข้องกับคีย์ต่างประเทศอื่น ๆ .. ฯลฯ "...