ทำไม DBMS บางอันไม่อนุญาตให้มีการย้อนกลับสำหรับคำสั่ง DDL


21

เมื่อเร็ว ๆ นี้ฉันพบว่า MySQL ไม่สนับสนุนการย้อนกลับของ DDL เช่น "แก้ไขตาราง" ... เคยชินกับ PostgreSQL ที่ทำให้ฉันแปลก แต่เพื่อนของฉันบอกฉันว่าแม้แต่ Oracle ก็ไม่ยอม .. มีเหตุผลทางเทคนิคหรือไม่ที่ไม่สนับสนุน มันเป็นเพียงคุณสมบัติ "ไม่น่าสนใจ" สำหรับพวกเขา?

แก้ไข: เพิ่งพบการเปรียบเทียบนี้ ดูเหมือนว่ามี DBMSes หลายอย่างที่ทำสนับสนุน DDL การทำธุรกรรม


3
MySQL ไม่อนุญาต DDL ในการทำธุรกรรม ก่อนดำเนินการคำสั่ง DDL คำสั่งจะทำธุรกรรมปัจจุบัน (คำสั่ง DML ปัจจุบันทั้งหมดภายในธุรกรรมนี้!) โดยไม่มีการเตือนใด ๆ
Frank Heikens

ตรงที่น่ารำคาญมาก IMO :)
Joril

ฉันประหลาดใจเองว่า Postgres ช่วยให้มัน - คุณยังสามารถม้วนกลับDROPหรือRENAME?
Joe

1
ตราบใดที่คุณไม่ได้ทิ้งฐานข้อมูลทั้งหมดใช่ :) ดูลิงค์ที่ฉันเพิ่งเพิ่ม
Joril

ดังนั้น Oracle และ MySQL เท่านั้นจึงไม่อนุญาตให้ใช้คำสั่ง DDL ในการทำธุรกรรม คุณลักษณะนี้ช่วยให้ปรับใช้สคีมาได้ง่ายจริงๆ
แมเรียน

คำตอบ:


19

เหตุผลที่การทำงานใน PostgreSQL คือแคตตาล็อกระบบเป็นตารางปกติ ยกตัวอย่างเช่นการสร้างฟังก์ชั่นใหม่เพียงแค่ต้องการแทรกแถวลงในpg_procตารางการเปลี่ยนค่าเริ่มต้นของคอลัมน์เพียงแค่ต้องการทำการอัปเดตไปยังบางแถวในpg_attrdefเป็นต้น เนื่องจากตารางมีการทำธุรกรรมอยู่แล้วคุณเกือบจะต้องออกนอกเส้นทางของคุณเพื่อไม่ให้ตารางทำงานแบบนั้น (รายละเอียดการใช้งานที่เจ็บปวดไม่ได้ระบุไว้ที่นี่ ;-))

ฉันสมมติว่าไม่ทราบซอร์สโค้ดว่าเอ็นจินฐานข้อมูลอื่นใช้โครงสร้างภายในที่กำหนดเองบางอย่างเพื่อแสดงข้อมูลแคตตาล็อกระบบ ดังนั้นพวกเขาจึงต้องใช้ความพยายามเป็นพิเศษมีความพยายามเพิ่มมากขึ้นเพื่อให้ DDL ของทรานแซกชันทำงานได้และดูเหมือนจะไม่สำคัญสำหรับพวกเขา

นี่คือเหตุผลว่าทำไมการอัพเกรดรุ่นที่สำคัญของ PostgreSQL นั้นเจ็บปวดมาก ผลิตภัณฑ์อื่น ๆ สามารถออกแบบโครงสร้างข้อมูลเมตาภายในของพวกเขาด้วยการเปลี่ยนแปลงและการปรับปรุงในใจและดังนั้นจึงไม่มีปัญหากับการอัพเกรดเป็นรุ่นใหญ่ใหม่ ใน PostgreSQL ไม่มีวิธีใดที่จะเปลี่ยนตารางแคตตาล็อกระบบให้ดูคล้ายกับตารางแค็ตตาล็อกระบบรุ่นใหม่อย่างน้อยก็ในขณะที่ไม่ทำให้ระบบออนไลน์อยู่ในขณะนี้เพราะจะต้องเข้าถึงแคตตาล็อกระบบ Urgh


1
ดีฉันต้องการ DB ของฉันในสถานะที่สอดคล้องตลอดเวลากว่าความสะดวกในการอัพเกรด DB- รุ่น แต่ฉันคิดว่ามันเป็นเรื่องของความเห็น :) ขอบคุณสำหรับคำอธิบายของคุณ!
Joril

นี่อาจอธิบายปัญหาสำหรับฐานข้อมูลบางตัว แต่แคตตาล็อกระบบเป็นตารางปกติใน Oracle
Leigh Riffel

10

ส่วนใหญ่ไม่ได้ คนเกียจคร้าน

ฉันใช้ SQL Server เป็นหลัก ฉันรู้ว่า Oracle ไม่ได้ แต่ฉันคิดว่า Oracle อาจผิดปกติ

ใน SQL Server ฉันค่อนข้างแน่ใจว่าคุณสามารถเรียกใช้คำสั่ง DDL หลายรายการในธุรกรรมเดียวแม้ว่าฉันคิดว่ามีข้อ จำกัด อยู่สองข้อ (ซึ่งฉันลืมไปแล้วทั้งหมด) คุณสามารถสร้างหรือปรับเปลี่ยนหรือลดลงของสิ่งส่วนใหญ่และย้อนกลับถ้าคุณชอบ Red-Gate SQL Compare (เครื่องมือที่ฉันชอบ) ใช้ประโยชน์จากสิ่งนี้

ปัญหาในการทำเช่นนี้คือขอบเขตการทำธุรกรรมของคุณน่าสนใจพอสมควร ... เมื่อคุณเกี่ยวข้องกับแคตตาล็อกระบบในธุรกรรมการปรับปรุง (DDL) คุณเสี่ยงต่อการถูกล็อคที่สำคัญจริงๆและคุณอาจปิดกั้นการเข้าถึงแคตตาล็อกระบบ ผู้ใช้ไม่สามารถทำอะไรได้มากหากคำสั่งของพวกเขาไม่สามารถหาตารางในแคตตาล็อก

แม้ว่าจะมีความสมดุล แต่ก็มีประโยชน์ที่จะรวม DDL ในการทำธุรกรรมหลายงบ

เพิ่มเติมประโยชน์คำสั่ง SQL Server DDL ยังสามารถเป็นส่วนหนึ่งของการทำธุรกรรมหลายคำสั่งTRUNCATE คุณสามารถตัดทอนตารางเป้าหมาย (เร็วมาก) สร้างตารางแล้วทำคอมมิทถ้าคุณชอบผลลัพธ์ หากมีบางอย่างผิดปกติคุณจะย้อนกลับและ voila! เหมือนว่าคุณไม่เคยรบกวนตาราง พื้นที่บันทึกจะลดลง ฉันใช้ประโยชน์จากสิ่งนี้บ่อยครั้ง


2
ต่อไปนี้เป็นคำตอบที่แสดงตัวอย่างของ DDL ที่เชื่อมโยงกับธุรกรรมใน SQL Server ฉันคิดเสมอว่าTRUNCATEไม่สามารถย้อนกลับได้ ฉันผิดไป.
Nick Chammas

5

ใน SQL Server เราสามารถย้อนกลับคำสั่ง DDL มันไม่ได้ใช้ auto commit เมื่อสิ้นสุดคำสั่ง ใน DBMS อื่น ๆ ฉันไม่รู้ แต่ฉันจำได้ว่าใน Oracle ไม่สามารถทำเช่นเดียวกัน ฉันเชื่อว่ามันเฉพาะเจาะจงสำหรับแต่ละ DBMS ไม่แน่ใจว่ามาตรฐาน SQL จะพูดเกี่ยวกับเรื่องนี้อย่างไร แต่ฉันแน่ใจว่าไม่มีผู้ผลิตใช้มาตรฐาน 100%

มีคำถามที่คล้ายกันเกี่ยวกับ SO: เป็นไปได้หรือไม่ที่จะเรียกใช้คำสั่ง DDL หลายรายการภายในธุรกรรม (ภายใน SQL Server)


5

Oracle มีการแยกวิเคราะห์แบบสอบถามที่ใช้ร่วมกันดังนั้น SELECT * FROM table_a ที่ดำเนินการโดยหนึ่งเซสชันนั้น (โดยปกติ) จะเหมือนกับของเซสชันอื่น นั่นจะแตกถ้าเซสชั่นหนึ่งคิดว่ามีสิบคอลัมน์ในตารางและอีกคิดว่ามีสิบเอ็ด


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

2
นอกจากนี้เวอร์ชั่น 11gR2 ยังนำเสนอแนวคิดของ Editions เพื่อช่วยในการอัพเกรดที่น่าสนใจ การเชื่อมต่อที่มีอยู่อย่างมีประสิทธิภาพใช้หนึ่งฉบับ (มีห้าคอลัมน์) คุณเริ่มต้นฉบับใหม่เพิ่มคอลัมน์และเริ่มการเชื่อมต่อใหม่โดยใช้ฉบับใหม่สำหรับเซสชันใหม่ เมื่อเซสชันที่ยอดเยี่ยมทั้งหมดเสร็จสิ้นแล้วรุ่นเก่าจะ cruft และทุกอย่างใช้รุ่นใหม่ ไม่มีการย้อนกลับ แต่คุณไม่ได้ทำกิจกรรมใหม่ในรุ่นใหม่ของคุณจนกว่ากิจกรรมทั้งหมดจะทำงาน
Gary
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.