2009-06-25 15 views
28

मुझे आश्चर्य है कि लेनदेन के अंदर कई डीडीएल विवरणों को चलाने के लिए संभव है या नहीं। मैं विशेष रूप से SQL सर्वर पर रूचि रखता हूं, भले ही अन्य डेटाबेस (ओरेकल, पोस्टग्रेएसक्यूएल कम से कम) के साथ उत्तर भी दिलचस्प हो।क्या लेनदेन के अंदर कई डीडीएल स्टेटमेंट चलाने के लिए संभव है (SQL सर्वर के भीतर)?

मैं लेनदेन के अंदर बनाई गई तालिका के लिए कुछ "तालिका बनाएं" और "दृश्य बनाएं" कर रहा हूं और कुछ असंगतताएं प्रतीत होती हैं और मुझे आश्चर्य है कि लेनदेन के अंदर डीडीएल नहीं किया जाना चाहिए। ..

मैं शायद लेन-देन के बाहर ले जाने के DDL सकता है, लेकिन मैं इसके लिए कुछ संदर्भ प्राप्त करना चाहते हैं। मैं इतनी दूर क्या पाया है:

  • MSDN पेज Isolation Levels in the Database Engine स्पष्ट रूप से है कि वहाँ क्या DDL संचालन एक स्पष्ट लेनदेन है कि स्नैपशॉट अलगाव के तहत चल रहा है में किया जा सकता पर प्रतिबंध है बताता है - लेकिन मैं स्नैपशॉट अलगाव का उपयोग नहीं और यह एक त्रुटि के रूप में परिणाम होना चाहिए।
    • इसका अर्थ यह हो सकता है कि डीडीएल संचालन अलग अलगाव स्तर के तहत एक स्पष्ट लेनदेन में प्रदर्शन किया जा सके? सीधे इस्तेमाल किया एसक्यूएल सर्वर के लिए इस वैध है भी -
  • Oracle® Database Gateway for SQL Server User's Guide#DDL Statements कहा गया है कि केवल एक DDL बयान दिए गए लेन-देन में क्रियान्वित किया जा सकता?

ओरेकल के लिए:

  • के भीतर ऐसा Unit testing DDL statements that need to be in a transaction सवाल यह कहा ओरेकल निहित है कि है एक DDL बयान के लिए प्रतिबद्ध? (भले ही कोई संदर्भ नहीं)

यदि यह कुछ मायने रखता है, तो मैं जावा के साथ जेटीडीएस जेडीबीसी ड्राइवर के माध्यम से ऐसा कर रहा हूं।

बीआरआर Touko

उत्तर

1

यह हो सकता है कि एमएस एसक्यूएल में, अंतर्निहित लेनदेन ट्रिगर कर रहे हैं जब DDL और DML बयान चलाए जा रहे हैं। आप इस बंद हो तो करता है यह सहायता, सेट IMPLICIT_TRANSACTIONS

संपादित का उपयोग करें: एक और संभावना - आप एक ही बैच में अन्य बयानों के साथ दृश्य बनाने के साथ नहीं जोड़ सकते। टेबल बनाएं ठीक है। आप गो के साथ अलग बैचों।

EDIT2: जब तक एक सौदे में एक से अधिक DDL उपयोग कर सकते हैं विभिन्न समूहों बनाने के लिए GO के साथ अलग कर दिया।

+0

मैं जेडीबीसी कनेक्शन # setAutoCommit (झूठा) का उपयोग कर रहा हूं और डीएमएल कथन अंतर्निहित लेनदेन के साथ नहीं किया जाता है। परिणाम अधिक दिखते हैं कि तालिका बनाने के लिए तालिका हमेशा वहां या कुछ नहीं होगी। – Touko

+0

संपादित करने के लिए: यह हो सकता है लेकिन मुझे SQL सर्वर दस्तावेज़ या कुछ ऐसा कुछ संदर्भ चाहिए, चाहे वह है या अनुमति नहीं है .. – Touko

+0

मैंने इस पुस्तक का उपयोग किया, देखें कि क्या आपको ऑनलाइन मिल रहा है? माइक्रोसॉफ्ट® एसक्यूएल सर्वर® 2008 टी-एसक्यूएल बुनियादी बातों प्रिंट आईएसबीएन -10: 0-7356-2601-4 प्रिंट आईएसबीएन -13: 978-0-7356-2601-0 – Stuart

1

सामान्य मामले और IIRC के लिए, यह मान लेना DDL बयान व्यवहार कर रहे हैं सुरक्षित नहीं है।

कहना है कि, वहाँ कैसे स्कीमा परिवर्तन एक सौदे के भीतर बातचीत पर छूट के एक महान सौदा (यह मानते हुए यह बिल्कुल नहीं है) है। यह विक्रेता द्वारा या यहां तक ​​कि विशेष स्थापना द्वारा भी हो सकता है (यानी, डीबीए तक) मेरा मानना ​​है। तो कम से कम, एक डीबीएमएस का उपयोग यह न मानने के लिए करें कि अन्य लोग डीडीएल कथन का इलाज करेंगे।

संपादित करें: MySql एक डीबीएमएस जो सभी पर DDL लेनदेन का समर्थन नहीं करता का एक उदाहरण है।इसके अलावा, यदि आपके पास डेटाबेस प्रतिकृति/मिररिंग है तो आपको बहुत सावधान रहना होगा कि प्रतिकृति सेवा (साइबेस की प्रतिकृति मानक है, मान लीजिए या नहीं) वास्तव में डीडीएल कथन को दोहराएगी।

4

यदि आप फ्लाई (टेबल चर या अस्थायी तालिकाओं के अलावा) पर टेबल, दृश्य आदि बना रहे हैं, तो आपको वास्तव में अपने डिज़ाइन पर पुनर्विचार करने की आवश्यकता हो सकती है। यह सामान नहीं है जो सामान्य रूप से उपयोगकर्ता इंटरफ़ेस से होना चाहिए। भले ही आपको कुछ अनुकूलन की अनुमति देनी पड़े, फिर भी डीडीएल स्टेटमेंट्स लेनदेन संबंधी आवेषण/अपडेट/हटाए जाने के साथ ही नहीं हो रहा है। इन कार्यों को अलग करना कहीं बेहतर है।

यह ऐसा कुछ भी है जिसे विचार और परीक्षण की स्वस्थ खुराक की आवश्यकता होती है, जब दो उपयोगकर्ता एक ही समय में एक ही तालिका की संरचना को बदलने की कोशिश करते हैं और फिर डेटा डालने के लिए लेनदेन चलाते हैं। कुछ सचमुच डरावनी चीजें हैं जो तब हो सकती हैं जब आप उपयोगकर्ताओं को अपनी डेटाबेस संरचना में समायोजन करने की अनुमति देते हैं।

इसके अलावा कुछ डीडीएल विवरण हमेशा बैच का पहला विवरण होना चाहिए। उस समय भी देखें जब आप उन्हें चला रहे हों।

+0

आपको इस परियोजना के साथ दुर्भाग्य से अच्छा लगा है, मुझे इस विरासत डीबी डिजाइन के लिए मजबूर किया गया है .. ये बैच SQL सर्वर कथन की एक इकाई प्रतीत होते हैं .. शायद मैं अपने सभी बयान जेडीबीसी के साथ अलग बैचों में चला रहा हूं मैं स्पष्ट रूप से इसे चाहता हूं .. कम से कम मुझे लगता है .. – Touko

+18

मैं जोड़ूंगा कि मुझे डीडीएल लेनदेन एक अलग सेट परिस्थितियों के लिए बहुत उपयोगी लगेगा - फ्लाई पर अपडेट नहीं, लेकिन यह सुनिश्चित करना कि उत्पादन डेटाबेस में स्कीमा अपडेट कभी नहीं छोड़े गए एक असंगत राज्य। – Nathan

+6

या स्कीमा माइग्रेट करने के लिए जब डीबी पूरी तरह से एप्लिकेशन द्वारा प्रबंधित किया जाता है, और उपयोगकर्ता ने आपके ऐप के पहले संस्करण से बाद में एक में अपग्रेड किया है। इस तरह के माइग्रेशन कभी विफल नहीं होना चाहिए, लेकिन अगर वे पूर्व-माइग्रेशन स्थिति में डीबी छोड़ दिया जाता है तो वे बेहतर होते हैं। –

13

मुझे पता है कि अधिकांश डेटाबेस में प्रतिबंध हैं, लेकिन पोस्टग्रेस नहीं है। आप लेनदेन में किसी भी संख्या तालिका निर्माण, कॉलम परिवर्तन और अनुक्रमणिका परिवर्तन चला सकते हैं, और परिवर्तन अन्य उपयोगकर्ता इकाई COMMIT सफल होने के लिए दृश्यमान नहीं हैं। इस तरह डेटाबेस होना चाहिए! :-)

SQL सर्वर के लिए आप लेनदेन के अंदर डीडीएल चला सकते हैं, लेकिन SQL Server does not version metadata, और लेनदेन करने से पहले अन्य लोगों के लिए परिवर्तन दिखाई देंगे। लेकिन some DDL statements can be rolled back if you are in a transaction, लेकिन जिनके लिए काम करते हैं और कौन से आपको कुछ परीक्षण चलाने की आवश्यकता नहीं होगी।

+2

दो साल बाद कुछ फॉलोअप के साथ अपने आप को जवाब देने के लिए ... हालांकि SQL सर्वर डीडीएल के लिए अलग लेनदेन नहीं देता है, लेकिन यह एक लेनदेन का हिस्सा बनने वाले कई डीडीएल विवरणों को रोलबैक कर सकता है।मेरे सहयोगी ने बस SQL ​​Server 2008 R2 पर एक परीक्षण किया: "मैंने एक टेबल बनाने की कोशिश की, एक प्राथमिक कुंजी कॉलम जोड़ना, दूसरी तालिका में डालना, दूसरी तालिका में एक कॉलम जोड़ना, उसमें डालना और फिर कुछ अमान्य SQL सब कुछ के साथ त्रुटि को मजबूर करना सही ढंग से वापस लुढ़का! "। बस सुनिश्चित करें कि प्रत्येक डीडीएल कथन अपने स्वयं के बैच में है (जाओ विभाजक का उपयोग करके)। –

+1

क्या लेना चाहिए, "डेटाबेस उपयोग में होने पर SQL सर्वर में डीडीएल चलाएं"? जैसा कि, आमतौर पर डीडीएल के लिए लेनदेन का उपयोग करना ठीक है, जब तक कि कोई भी टेबल पढ़ नहीं रहा हो (जिसका अर्थ यह है कि जब आप डेटाबेस को अद्यतन करते हैं तो आपकी वेबसाइट नीचे होनी चाहिए, जो शायद इसे चाहिए, वैसे भी)। – jpmc26

+0

मैं पुष्टि कर सकता हूं कि एक विस्तृत सीआरयूडी लेनदेन के हिस्से के रूप में इंग्रेस (कम से कम) स्तंभ परिवर्तनों की अनुमति देता है। पोस्टग्रेस/इंग्रेस रिश्ते को शायद आश्चर्य की बात नहीं है। – Sepster