कुछ डीडीएल बयानों के लिए कुछ डीबीएमएस की अनुमति क्यों नहीं होगी?


21

हाल ही में मुझे पता चला कि MySQL DDL के रोलबैक का समर्थन नहीं करता है जैसे कि "परिवर्तन तालिका" ... PostgreSQL के लिए इस्तेमाल होने के नाते, यह मुझे अजीब लगता है, लेकिन मेरे एक दोस्त ने मुझे बताया कि ओरेकल भी इसकी अनुमति नहीं देता है। क्या इसका समर्थन नहीं करने के तकनीकी कारण हैं? क्या यह केवल उनके लिए एक "निर्बाध" सुविधा है?

संपादित करें: बस यह तुलना मिली । ऐसा लगता है कि कई डीबीएमएस हैं जो ट्रांजेक्शनल डीडीएल का समर्थन करते हैं


3
MySQL डीडीएल को लेनदेन के अंदर अनुमति नहीं देता है। DDL स्टेटमेंट्स को निष्पादित करने से पहले, यह बिना किसी चेतावनी के वर्तमान ट्रांजेक्शन (इस ट्रांजैक्शन के अंदर सभी डीएमएल स्टेटमेंट्स) को कमिट करता है।
फ्रैंक हाइकेन

वास्तव में, काफी कष्टप्रद IMO :)
Joril

मैं व्यक्तिगत रूप से आश्चर्यचकित हूं कि Postgres इसे अनुमति देता है - क्या आप एक DROPया एक रोल भी वापस कर सकते हैं RENAME?
जो

1
जब तक आप पूरे डेटाबेस को नहीं छोड़ते, हाँ :) लिंक देखें जो मैंने अभी जोड़ा है
Joril

इसलिए केवल Oracle और MySQL लेनदेन के भीतर DDL स्टेटमेंट की अनुमति नहीं देते हैं। यह सुविधा वास्तव में आसान स्कीमा दर्शाती है।
मरिअन

जवाबों:


19

PostgreSQL में काम करने का कारण यह है कि सिस्टम कैटलॉग नियमित टेबल हैं। इसलिए, एक नया फ़ंक्शन बनाते हुए, उदाहरण के लिए, बस pg_procतालिका में एक पंक्ति सम्मिलित करने की आवश्यकता होती है , स्तंभ के डिफ़ॉल्ट मान को बदलने के लिए बस कुछ पंक्ति में pg_attrdefऔर इसके लिए एक अद्यतन बनाने की आवश्यकता होती है । चूंकि टेबल किसी भी तरह से लेन-देन योग्य हैं, इसलिए आपको इस तरह से काम नहीं करना होगा। (दर्दनाक कार्यान्वयन विवरण के बहुत सारे यहाँ छोड़ दिया; ;-))

मुझे लगता है, स्रोत कोड को नहीं जानते हुए, कि अन्य डेटाबेस इंजन अपने सिस्टम कैटलॉग जानकारी का प्रतिनिधित्व करने के लिए कुछ कस्टम आंतरिक संरचनाओं का उपयोग करते हैं। और इसलिए उन्हें ट्रांसेक्शनल डीडीएल काम करने के लिए अतिरिक्त प्रयास, बहुत सारे अतिरिक्त प्रयास की आवश्यकता होती है, और यह स्पष्ट रूप से उनके लिए प्राथमिकता नहीं है।

इसका दूसरा पहलू यह है कि यही कारण है कि PostgreSQL का प्रमुख संस्करण उन्नयन इतना दर्दनाक है। अन्य उत्पाद संभवतः परिवर्तन और अद्यतन को ध्यान में रखते हुए अपनी आंतरिक मेटाडेटा संरचनाओं को डिज़ाइन कर सकते हैं, और इसलिए नए प्रमुख संस्करण में अपग्रेड करने के लिए कोई समस्या नहीं है। PostgreSQL में, सिस्टम कैटलॉग तालिका के नए संस्करण की तरह अचानक देखने के लिए सिस्टम कैटलॉग तालिका को बदलने का कोई तरीका नहीं है, कम से कम सिस्टम को ऑनलाइन रखने के दौरान नहीं, क्योंकि सिस्टम कैटलॉग तक पहुंच की आवश्यकता होगी। Urgh।


1
वैसे मैं अपने DB को एक सुसंगत अवस्था में हर समय आसानी-से-DB-वर्जन-अपग्रेड में पसंद करूंगा, लेकिन मुझे लगता है कि यह एक राय का विषय है :) आपके स्पष्टीकरण के लिए धन्यवाद!
Joril

यह कुछ डेटाबेस के लिए समस्या की व्याख्या कर सकता है, लेकिन सिस्टम कैटलॉग ओरेकल पर नियमित टेबल हैं।
लेह रिफ़ेल

10

सबसे नहीं? ओह।

मैं मुख्य रूप से SQL सर्वर का उपयोग करता हूं और यह करता है। मुझे पता है कि ओरेकल नहीं है, लेकिन मुझे लगा कि ओरेकल एक विपथन हो सकता है।

SQL सर्वर में, मुझे पूरा यकीन है कि आप एक ही लेन-देन में कई DDL स्टेटमेंट चला सकते हैं, हालांकि मुझे लगता है कि इसमें कुछ प्रतिबंध हैं (जो कि मैं सब भूल गया हूं)। आप अपनी पसंद की कोई चीज़ बना सकते हैं या बदल सकते हैं या उसे बदल सकते हैं और वापस ले जा सकते हैं। रेड-गेट SQL तुलना (एक उपकरण जिसे मैं प्यार करता हूं) इसका लाभ उठाता है।

ऐसा करने के साथ समस्या यह है कि आपके लेन-देन का दायरा काफी दिलचस्प हो जाता है ... जब आप सिस्टम कैटलॉग को अपडेट ट्रांजेक्शन (DDL) में शामिल करते हैं, तो आप कुछ बहुत महत्वपूर्ण ताले लेने का जोखिम चलाते हैं और आप सिस्टम कैटलॉग तक पहुंच को अवरुद्ध कर सकते हैं। यदि उपयोगकर्ता अपने प्रश्नों को कैटलॉग में अपनी तालिका नहीं पा सकते हैं तो वे बहुत कुछ नहीं कर सकते हैं!

हालांकि, शेष राशि पर, डीडीएल को मल्टी-स्टेटमेंट ट्रांजेक्शन में शामिल करना आसान है।

अधिक उपयोगी रूप से, SQL सर्वर DDL कमांड TRUNCATE भी मल्टी-स्टेटमेंट लेनदेन का एक तत्व हो सकता है । आप एक लक्ष्य तालिका (बहुत तेज़) को काट सकते हैं, इसका निर्माण कर सकते हैं, और फिर यदि आपको परिणाम पसंद है तो एक प्रतिबद्ध करें। अगर कुछ गलत हो जाता है, तो आप रोलबैक और वॉयला!, यह ऐसा है जैसे आपने टेबल को कभी परेशान नहीं किया। लॉग स्पेस भी कम से कम है। मैं काफी बार इसका फायदा उठाता हूं।


2
यहां एक जवाब है जो SQL सर्वर में लेनदेन-बाउंड DDL का उदाहरण दिखाता है। इसके अलावा, मैंने हमेशा सोचा था कि TRUNCATEइसे वापस नहीं लाया जाएगा। मैं गलत था।
निक चम्मास

5

SQL सर्वर में हम DDL स्टेटमेंट को रोलबैक कर सकते हैं, यह स्टेटमेंट के अंत में ऑटो कमिट का उपयोग नहीं कर रहा है। अन्य DBMS में मुझे नहीं पता, लेकिन मुझे याद है कि Oracle में कोई भी ऐसा नहीं कर सकता है। मेरा मानना ​​है कि यह प्रत्येक DBMS के लिए विशिष्ट है, यह सुनिश्चित नहीं है कि SQL मानक इस बारे में क्या कहेंगे, लेकिन मुझे यकीन है कि कोई भी निर्माता मानक 100% लागू नहीं करता है।

SO पर एक समान प्रश्न है: क्या लेनदेन के अंदर (SQL सर्वर के भीतर) कई DDL स्टेटमेंट चलाना संभव है?


5

Oracle ने क्वेरी पार्सिंग को साझा किया है, इसलिए एक सत्र का चयन * FROM table_a से किया जाता है (सामान्य रूप से) दूसरे सत्र के समान। अगर एक सत्र में सोचा कि तालिका में दस स्तंभ थे और एक और विचार ग्यारह थे।


दिलचस्प है कि आपको यह कहना चाहिए कि, मेरे पास दूसरे दिन भी इसी तरह का मुद्दा था, आवेदन को "गर्म" तैनात किया जाना चाहिए था, लेकिन नए संस्करण के लिए तालिका संरचना को बदलना, इसके पास JDBC को फिर से तैयार करने के लिए कोई रास्ता नहीं था। , उस के लिए बहुत!
गयुस

2
एक तरफ के रूप में, 11gR2 संस्करण गर्म उन्नयन के साथ सहायता करने के लिए संस्करणों की अवधारणा का परिचय देता है। प्रभावी रूप से मौजूदा कनेक्शन एक संस्करण (पांच कॉलम के साथ) का उपयोग करते हैं। आप एक नया संस्करण शुरू करते हैं, एक कॉलम जोड़ते हैं और नए सत्रों के लिए नए संस्करण का उपयोग करते हुए कुछ नए कनेक्शन शुरू करते हैं। एक बार सभी बकाया सत्र समाप्त हो जाने के बाद, पुराना संस्करण cruft है और सब कुछ नए संस्करण का उपयोग करता है। कोई रोलबैक नहीं है, लेकिन आप अपने नए संस्करण पर नई गतिविधि को तब तक नहीं डालेंगे जब तक कि यह सब काम न कर जाए।
गैरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.