संस्करण SQL सर्वर डेटाबेस

मैं अपने डेटाबेस को संस्करण नियंत्रण के तहत प्राप्त करना चाहता हूं। क्या मुझे शुरू करने के लिए किसी को कोई सलाह या अनुशंसित लेख है?

मैं हमेशा वहां कम से कम कुछ डेटा रखना चाहता हूं (जैसे alumb उल्लेख: उपयोगकर्ता प्रकार और प्रशासक)। मैं अक्सर प्रदर्शन माप के लिए जेनरेट टेस्ट डेटा का एक बड़ा संग्रह चाहता हूं।

0
जोड़ा संपादित
विचारों: 1
इस तरह के एक सवाल पर एक नज़र डालें। stackoverflow.com/questions/56903/database-changes-versionin‌ g </ a >
जोड़ा लेखक stukelly, स्रोत
@ ashy_32bit विशिष्ट stackoverflow / stackexchange तर्क। यही वह है जो मुझे इस वेबसाइट के बारे में पसंद नहीं है; बेवकूफ कारणों से बहुत सी अच्छी चीजें बंद हो जाती हैं। इस वजह से मैं शायद ही कभी प्रश्न पोस्ट करता हूं। मेरे पास सुरक्षा स्टैक्सएक्सचेंज पर पास-मॉडरेटर अनुमतियां हैं और करीबी वोट प्राप्त करने वाले आधा धागे को खोलने / दोबारा खोलने के लिए वोट दें।
जोड़ा लेखक Luc, स्रोत
154 अपवॉट्स और 146 एफएवी और बंद? यह कैसे संभव है?
जोड़ा लेखक ashy_32bit, स्रोत
[संस्करण डेटाबेस - शाखाकरण और विलय] नया लिंक: odetocode.com/blogs/scott/archive/2008/02/03/…
जोड़ा लेखक Fil, स्रोत
इस श्वेत पत्र पर भी नज़र डालें; डेटाबेस संस्करण नियंत्रण के लिए परिभाषित मार्गदर्शिका www3.dbmaestro.com/&hellip ;
जोड़ा लेखक DBAstep, स्रोत

28 उत्तर

हम अपने SQL डेटाबेस को प्रबंधित करने के लिए DBGhost का उपयोग करते हैं। फिर आप अपनी स्क्रिप्ट को अपने संस्करण नियंत्रण में एक नया डेटाबेस बनाने के लिए डालते हैं, और यह या तो एक नया डेटाबेस तैयार करेगा, या किसी भी मौजूदा डेटाबेस को संस्करण नियंत्रण में स्कीमा में अपग्रेड करेगा। इस तरह आपको परिवर्तन स्क्रिप्ट बनाने के बारे में चिंता करने की ज़रूरत नहीं है (हालांकि आप अभी भी ऐसा कर सकते हैं, उदाहरण के लिए यदि आप कॉलम के डेटा प्रकार को बदलना चाहते हैं और डेटा को कनवर्ट करना चाहते हैं)।

0
जोड़ा
मैंने 10 साल तक डीबीगोस्ट का उपयोग किया है और यह मुझे कभी नीचे जाने नहीं देता है। उनके द्वारा प्रदान किया जाने वाला समर्थन किसी के लिए दूसरा नहीं है
जोड़ा लेखक penderi, स्रोत

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

0
जोड़ा

आप एक माइग्रेशन समाधान भी देख सकते हैं। ये आपको सी # कोड में अपना डेटाबेस स्कीमा निर्दिष्ट करने और MSBuild का उपयोग करके अपने डेटाबेस संस्करण को ऊपर और नीचे रोल करने की अनुमति देते हैं।

मैं वर्तमान में DbUp का उपयोग कर रहा हूं, और यह अच्छी तरह से काम कर रहा है।

0
जोड़ा

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

यदि आप अधिकतर अपनी स्कीमा का संस्करण बनाना चाहते हैं और केवल थोड़ी सी संदर्भ डेटा है, तो आप संभवतः सबसोनिक माइग्रेशन । लाभ यह है कि आप आसानी से किसी भी विशिष्ट संस्करण में ऊपर या नीचे माइग्रेट कर सकते हैं।

0
जोड़ा

मार्टिन फाउलर ने इस विषय पर अपना पसंदीदा लेख लिखा, http://martinfowler.com/articles/evodb.html</एक>। मैं संस्करण नियंत्रण के तहत स्कीमा डंप को alumb के रूप में नहीं रखना चुनता हूं और अन्य सुझाव देते हैं क्योंकि मैं अपने उत्पादन डेटाबेस को अपग्रेड करने का एक आसान तरीका चाहता हूं।

एक वेब एप्लिकेशन के लिए जहां मेरे पास एक एकल उत्पादन डेटाबेस उदाहरण होगा, मैं दो तकनीकों का उपयोग करता हूं:

डाटाबेस अपग्रेड स्क्रिप्ट्स

A sequence डाटाबेस अपग्रेड स्क्रिप्ट्स that contain the DDL necessary to move the schema from version N to N+1. (These go in your version control system.) A _version_history_ table, something like

create table VersionHistory (
    Version int primary key,
    UpgradeStart datetime not null,
    UpgradeEnd datetime
    );

हर बार एक अपग्रेड स्क्रिप्ट चलाता है जो नए संस्करण के अनुरूप होता है।

This ensures that it's easy to see what version of the database schema exists and that डाटाबेस अपग्रेड स्क्रिप्ट्स are run only once. Again, these are not database dumps. Rather, each script represents the changes necessary to move from one version to the next. They're the script that you apply to your production database to "upgrade" it.

डेवलपर सैंडबॉक्स सिंक्रनाइज़ेशन

  1. उत्पादन डेटाबेस को बैकअप, sanitize, और संक्षिप्त करने के लिए एक स्क्रिप्ट। उत्पादन डीबी में प्रत्येक अपग्रेड के बाद इसे चलाएं।
  2. एक डेवलपर के वर्कस्टेशन पर बैकअप को पुनर्स्थापित करने के लिए एक स्क्रिप्ट (और यदि आवश्यक हो तो ट्विक करें)। प्रत्येक डेवलपर उत्पादन डीबी में प्रत्येक अपग्रेड के बाद इस स्क्रिप्ट को चलाता है।

एक चेतावनी: मेरे स्वचालित परीक्षण स्कीमा-सही लेकिन खाली डेटाबेस के विरुद्ध चलते हैं, इसलिए यह सलाह पूरी तरह से आपकी आवश्यकताओं के अनुरूप नहीं होगी।

0
जोड़ा
वास्तव में निराशाजनक बात यह है कि एक वीएस डेटाबेस प्रोजेक्ट इन स्कीमा अपडेट के लिए आवश्यक स्क्रिप्ट उत्पन्न कर सकता है, लेकिन यह सीधे उन्हें लागू करेगा। यह संस्करण इतिहास सामग्री को संभाल नहीं करेगा। आपको मैन्युअल रूप से ऐसा करना होगा, और यदि आप एक बार अपडेट स्क्रिप्ट को मैन्युअल रूप से जोड़ना भूल जाते हैं तो आप खराब हो जाते हैं क्योंकि आपका डीबी पहले ही अपडेट हो जाएगा और डीबी प्रोजेक्ट उसी अपडेट स्क्रिप्ट को फिर से उत्पन्न नहीं करेगा। मेरी इच्छा है कि एक प्रोजेक्ट प्रकार था जो संस्करण डेटाबेस प्रबंधन को संभाला था।
जोड़ा लेखक Jez, स्रोत
@ nikc.org का उत्तर, साथ ही स्वचालन के लिए पोस्ट-प्रतिबद्ध हुक।
जोड़ा लेखक Silviu-Marian, स्रोत
मेरे पास एक पूर्ण निर्माण और ड्रॉप स्क्रिप्ट बनाए रखने की आदत है, साथ ही वर्तमान डीबी उदाहरणों को अद्यतित करने के लिए डेल्टा स्क्रिप्ट्स की आदत है। दोनों संस्करण नियंत्रण में जाओ। डेल्टा स्क्रिप्ट को संशोधन संख्या के अनुसार नामित किया गया है। इस तरह अद्यतन स्क्रिप्ट के साथ डीबी पैचिंग स्वचालित करना आसान है।
जोड़ा लेखक nikc.org, स्रोत
कह रहे हैं कि आप स्रोत नियंत्रण में अपग्रेड स्क्रिप्ट डालते हैं, अखरोट रोलबैक नहीं डालते हैं?
जोड़ा लेखक A-K, स्रोत
पूर्ण स्कीमा स्क्रिप्ट को नियंत्रित करने वाले संस्करण संदर्भ उद्देश्यों के लिए बहुत उपयोगी हैं। उदाहरण के लिए, यह देखना असंभव है कि एल्टर प्रोसेसर स्टेटमेंट को देखकर संग्रहीत प्रक्रिया में वास्तव में क्या बदला गया था।
जोड़ा लेखक Constantin, स्रोत
नई अपग्रेड स्क्रिप्ट चलाने के बाद पूर्ण डीबी स्कीमा डंपिंग (और संस्करण) आपके निर्माण / तैनाती प्रक्रिया में अन्य टूल्स के लिए जानकारी उपलब्ध कराने का एक अच्छा तरीका है। साथ ही, स्क्रिप्ट में पूर्ण स्कीमा होने का मतलब है कि सभी माइग्रेशन चरणों के बिना बिना किसी नए डेटाबेस को "स्पिन अप" करने में सक्षम होना। यह संचित पिछले संस्करणों के खिलाफ मौजूदा संस्करण को अलग करना भी संभव बनाता है।
जोड़ा लेखक mlibby, स्रोत
मैं यह भी करता हूं, लेकिन मैं पूर्ण-पीढ़ी की स्क्रिप्ट के स्थान पर स्रोत नियंत्रण में सामान्य बैकअप फ़ाइल रखता हूं। मेरे अनुभव में तेज और कम समस्या-प्रवण। यह मनमाने ढंग से संस्करणों के बीच अंतर को थोड़ा कठिन बनाता है, लेकिन फिर ऐसा करने से अक्सर ऐसा नहीं होता है, और अद्यतन स्क्रिप्ट पूरी तरह से खोजने योग्य होते हैं, जो पर्याप्त होना चाहिए, क्योंकि सभी परिवर्तन उनके माध्यम से जाते हैं। साथ ही, डीबी के अंदर संस्करण संख्याओं के लिए, मैंने डेटाबेस ऑब्जेक्ट पर एक विस्तारित संपत्ति डाल दी। इस तरह यह डेटा के हिस्से के बजाय स्कीमा का हिस्सा है।
जोड़ा लेखक Atario, स्रोत

यह आसान है।

  1. जब मूल प्रोजेक्ट तैयार होता है तो आपको पूर्ण डेटाबेस स्क्रिप्ट बनाना होगा। यह स्क्रिप्ट एसवीएन को प्रतिबद्ध है। यह पहला संस्करण है।

  2. उसके बाद सभी डेवलपर्स परिवर्तन स्क्रिप्ट बनाता है (ALTER ..., नई टेबल, sprocs, आदि)।

  3. जब आपको वर्तमान संस्करण की आवश्यकता होती है तो आपको सभी नई परिवर्तन स्क्रिप्ट निष्पादित करनी चाहिए।

  4. जब ऐप को उत्पादन में रिलीज़ किया जाता है तो आप 1 पर वापस जाते हैं (लेकिन फिर यह पाठ्यक्रम का लगातार संस्करण होगा)।

नंत आपको उन परिवर्तन स्क्रिप्ट को निष्पादित करने में मदद करेगा। :)

और याद रखें। अनुशासन होने पर सब कुछ ठीक काम करता है। प्रत्येक बार जब डेटाबेस परिवर्तन किया जाता है तो कोड में संबंधित फ़ंक्शंस भी कम किए जाते हैं।

0
जोड़ा
कुछ सालों बाद मैं कहता हूं: FluentMigrator (या अपने प्लेटफ़ॉर्म के लिए समान टूल) का उपयोग करें।
जोड़ा लेखक dariol, स्रोत

मैं डाटाबेस विस्तारित गुण प्रक्रियाओं के परिवार के माध्यम से संग्रहीत डेटाबेस में एक संस्करण का भी उपयोग कर रहा हूं। मेरे एप्लिकेशन में प्रत्येक संस्करण चरण के लिए स्क्रिप्ट हैं (यानी 1.1 से 1.2 तक)। तैनात किए जाने पर, यह वर्तमान संस्करण को देखता है और फिर स्क्रिप्ट को एक-एक करके चलाता है जब तक कि यह अंतिम ऐप संस्करण तक नहीं पहुंच जाता। ऐसी कोई स्क्रिप्ट नहीं है जिसमें सीधा 'अंतिम' संस्करण है, यहां तक ​​कि एक स्वच्छ डीबी पर तैनाती अपग्रेड चरणों की एक श्रृंखला के माध्यम से तैनाती करता है।

Now what I like to add is that I've seen two days ago a presentation on the MS campus about the new and upcoming VS DB edition. The presentation was focused specifically on this topic and I was blown out of the water. You should definitely check it out, the new facilities are focused on keeping schema definition in T-SQL scripts (CREATEs), a runtime delta engine to compare deployment schema with defined schema and doing the delta ALTERs and integration with source code integration, up to and including MSBUILD continuous integration for automated build drops. The drop will contain a new file type, the .dbschema files, that can be taken to the deployment site and a command line tool can do the actual 'deltas' and run the deployment. I have a blog entry on this topic with links to the VSDE downloads, you should check them out: http://rusanu.com/2009/05/15/version-control-and-your-database/

0
जोड़ा

हम एक एक्स 64 प्लेटफ़ॉर्म पर माइग्रेट किए जाने के बाद हमारे SQL डेटाबेस को संस्करणित करने की आवश्यकता थी और माइग्रेशन के साथ हमारा पुराना संस्करण टूट गया। हमने एक सी # एप्लिकेशन लिखा था जो SQLDMO का उपयोग किसी SQL फ़ोल्डर को किसी फ़ोल्डर में मैप करने के लिए करता था:

                Root
                    ServerName
                       DatabaseName
                          Schema Objects
                             Database Triggers*
                                .ddltrigger.sql
                             Functions
                                ..function.sql
                             Security
                                Roles
                                   Application Roles
                                      .approle.sql
                                   Database Roles
                                      .role.sql
                                Schemas*
                                   .schema.sql
                                Users
                                   .user.sql
                             Storage
                                Full Text Catalogs*
                                   .fulltext.sql
                             Stored Procedures
                                ..proc.sql
                             Synonyms*
                                .synonym.sql
                             Tables
                                ..table.sql
                                Constraints
                                   ...chkconst.sql
                                   ...defconst.sql
                                Indexes
                                   ...index.sql
                                Keys
                                   ...fkey.sql
                                   ...pkey.sql
                                   ...ukey.sql
                                Triggers
                                   ...trigger.sql
                             Types
                                User-defined Data Types
                                   ..uddt.sql
                                xml Schema Collections*
                                   ..xmlschema.sql
                             Views
                                ..view.sql
                                Indexes
                                   ...index.sql
                                Triggers
                                   ...trigger.sql

एप्लिकेशन तब नए लिखित संस्करण की तुलना एसवीएन में संग्रहीत संस्करण में करेगा और यदि अंतर थे तो यह एसवीएन अपडेट करेगा। हमने निर्धारित किया कि रात में एक बार प्रक्रिया चलाना पर्याप्त था क्योंकि हम SQL में कई बदलाव नहीं करते हैं। यह हमें उन सभी वस्तुओं में परिवर्तनों को ट्रैक करने की इजाजत देता है जिनकी हम परवाह करते हैं और साथ ही यह हमें गंभीर समस्या की स्थिति में हमारी पूर्ण स्कीमा का पुनर्निर्माण करने की अनुमति देता है।

0
जोड़ा
ओह, सार्वजनिक रूप से उपलब्ध कराने के लिए यह बहुत अच्छा होगा।
जोड़ा लेखक Chris Charabaruk, स्रोत

मैंने कुछ समय पहले इस ऐप को लिखा था, http://sqlschemasourcectrl.codeplex.com/ जो आपके एमएसएफटी एसक्यूएल को स्कैन करेगा जितनी बार चाहें डीबी और एसवीएन में स्वचालित रूप से अपनी ऑब्जेक्ट्स (टेबल, विचार, प्रोसेस, फ़ंक्शंस, एसक्यूएल सेटिंग्स) को डंप करें। एक जादू की तरह काम करता है। मैं इसे अनफुडल के साथ उपयोग करता हूं (जो मुझे चेकइन पर अलर्ट प्राप्त करने की अनुमति देता है)

0
जोड़ा

यहां रेड गेट पर हम एक टूल प्रदान करते हैं, SQL स्रोत नियंत्रण , जो एक टीएफएस या एसवीएन भंडार के साथ अपने डेटाबेस को जोड़ने के लिए एसक्यूएल तुलना प्रौद्योगिकी का उपयोग करता है। यह टूल एसएसएमएस में एकीकृत करता है और आपको सामान्य रूप से काम करने देता है, सिवाय इसके कि अब आप ऑब्जेक्ट्स को प्रतिबद्ध करते हैं।

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

एसक्यूएल स्रोत नियंत्रण में स्थिर डेटा टेबल निर्दिष्ट करना संभव है। इन्हें स्रोत नियंत्रण में INSERT कथन के रूप में संग्रहीत किया जाता है।

यदि आप परीक्षण डेटा के बारे में बात कर रहे हैं, तो हम अनुशंसा करेंगे कि आप या तो टूल के साथ परीक्षण डेटा उत्पन्न करें या पोस्ट-परिनियोजन स्क्रिप्ट के माध्यम से परिभाषित करें, या आप देव वातावरण में केवल उत्पादन बैकअप को पुनर्स्थापित करते हैं।

0
जोड़ा
यह उत्तर दो साल पहले डेन के उत्तर का डुप्लिकेट है।
जोड़ा लेखक Knickerless-Noggins, स्रोत
दिलचस्प उत्पाद (बाजार में एक अंतर का बिट) लेकिन "CREATE ..." के रूप में संग्रहीत डेल्टा मुझे डराता है। आप कैसे ब्रांचिंग / विलय कर रहे हैं?
जोड़ा लेखक annakata, स्रोत
हम ऑब्जेक्ट परिभाषाओं को CREATE के रूप में संग्रहीत करते हैं, लेकिन यदि आप 'नवीनतम प्राप्त करते हैं' या, उदाहरण के लिए, सिंक स्क्रिप्ट उत्पन्न करने के लिए SQL तुलना प्रो का उपयोग करें, तो ये वैकल्पिक आदेशों जैसे कि ALTER में बदल जाएंगे। शाखा या विलय करने के लिए, आप बस अपने स्रोत नियंत्रण प्रणाली का उपयोग उसी तरह करेंगे जैसे आप वर्तमान में करते हैं।
जोड़ा लेखक David Atkinson, स्रोत
यह एक अलग जवाब है। एसक्यूएल तुलना संस्करण नियंत्रण डेटाबेस नहीं है, जबकि एसक्यूएल स्रोत नियंत्रण विशेष रूप से इसके लिए बनाया गया था।
जोड़ा लेखक David Atkinson, स्रोत

वीएस 2010 के साथ, डेटाबेस प्रोजेक्ट का उपयोग करें।

  1. Script out your database
  2. Make changes to scripts or directly on your db server
  3. Sync up using Data > Schema Compare

एक आदर्श डीबी संस्करण समाधान बनाता है, और डीबी की हवा को सिंक्रनाइज़ करता है।

0
जोड़ा
हाँ, लेकिन दुर्भाग्य से आपको हर बार "स्क्रिप्ट उत्पन्न करना" याद रखना होगा। यदि आप सीधे डेटाबेस अपडेट करते हैं, तो आप उस डेल्टा के लिए अद्यतन स्क्रिप्ट उत्पन्न करने की क्षमता खो देते हैं। यदि केवल डेटाबेस प्रोजेक्ट्स में वर्जनिंग के लिए कुछ अंतर्निहित कार्यक्षमता होगी।
जोड़ा लेखक Jez, स्रोत

डीबीगोस्ट http://www.innovartis.co.uk/ देखें। मैंने अब 2 साल के लिए एक स्वचालित फैशन में उपयोग किया है और यह बहुत अच्छा काम करता है। यह डेटाबेस के अलावा, हमारे डीबी को जावा या सी बिल्ड की तरह होने की अनुमति देता है। आप जानते हैं कि मेरा क्या मतलब है।

0
जोड़ा

एक स्रोत कोड नियंत्रण प्रणाली को डंप करने के लिए जो थोड़ा तेज़ है, आप देख सकते हैं कि आखिरी बार sysobjects में संस्करण जानकारी का उपयोग करके कौन सी ऑब्जेक्ट्स बदल गई हैं।

Setup: Create a table in each database you want to check incrementally to hold the version information from the last time you checked it (empty on the first run). Clear this table if you want to re-scan your whole data structure.

IF ISNULL(OBJECT_ID('last_run_sysversions'), 0) <> 0 DROP TABLE last_run_sysversions
CREATE TABLE last_run_sysversions (
    name varchar(128), 
    id int, base_schema_ver int,
    schema_ver int,
    type char(2)
)

Normal running mode: You can take the results from this sql, and generate sql scripts for just the ones you're interested in, and put them into a source control of your choice.

IF ISNULL(OBJECT_ID('tempdb.dbo.#tmp'), 0) <> 0 DROP TABLE #tmp
CREATE TABLE #tmp (
    name varchar(128), 
    id int, base_schema_ver int,
    schema_ver int,
    type char(2)
)

SET NOCOUNT ON

-- Insert the values from the end of the last run into #tmp
INSERT #tmp (name, id, base_schema_ver, schema_ver, type) 
SELECT name, id, base_schema_ver, schema_ver, type FROM last_run_sysversions

DELETE last_run_sysversions
INSERT last_run_sysversions (name, id, base_schema_ver, schema_ver, type)
SELECT name, id, base_schema_ver, schema_ver, type FROM sysobjects

-- This next bit lists all differences to scripts.
SET NOCOUNT OFF

--Renamed.
SELECT 'renamed' AS ChangeType, t.name, o.name AS extra_info, 1 AS Priority
FROM sysobjects o INNER JOIN #tmp t ON o.id = t.id
WHERE o.name <> t.name /*COLLATE*/
AND o.type IN ('TR', 'P' ,'U' ,'V')
UNION 

--Changed (using alter)
SELECT 'changed' AS ChangeType, o.name /*COLLATE*/, 
       'altered' AS extra_info, 2 AS Priority
FROM sysobjects o INNER JOIN #tmp t ON o.id = t.id 
WHERE (
   o.base_schema_ver <> t.base_schema_ver
OR o.schema_ver      <> t.schema_ver
)
AND  o.type IN ('TR', 'P' ,'U' ,'V')
AND  o.name NOT IN ( SELECT oi.name 
         FROM sysobjects oi INNER JOIN #tmp ti ON oi.id = ti.id
         WHERE oi.name <> ti.name /*COLLATE*/
         AND oi.type IN ('TR', 'P' ,'U' ,'V')) 
UNION

--Changed (actually dropped and recreated [but not renamed])
SELECT 'changed' AS ChangeType, t.name, 'dropped' AS extra_info, 2 AS Priority
FROM #tmp t
WHERE    t.name IN ( SELECT ti.name /*COLLATE*/ FROM #tmp ti
         WHERE NOT EXISTS (SELECT * FROM sysobjects oi
                           WHERE oi.id = ti.id))
AND  t.name IN ( SELECT oi.name /*COLLATE*/ FROM sysobjects oi
         WHERE NOT EXISTS (SELECT * FROM #tmp ti
                           WHERE oi.id = ti.id)
         AND   oi.type  IN ('TR', 'P' ,'U' ,'V'))
UNION

--Deleted
SELECT 'deleted' AS ChangeType, t.name, '' AS extra_info, 0 AS Priority
FROM #tmp t
WHERE NOT EXISTS (SELECT * FROM sysobjects o
                  WHERE o.id = t.id)
AND t.name NOT IN (  SELECT oi.name /*COLLATE*/ FROM sysobjects oi
         WHERE NOT EXISTS (SELECT * FROM #tmp ti
                           WHERE oi.id = ti.id)
         AND   oi.type  IN ('TR', 'P' ,'U' ,'V'))
UNION

--Added
SELECT 'added' AS ChangeType, o.name /*COLLATE*/, '' AS extra_info, 4 AS Priority
FROM sysobjects o
WHERE NOT EXISTS (SELECT * FROM #tmp t
                  WHERE o.id = t.id)
AND      o.type  IN ('TR', 'P' ,'U' ,'V')
AND  o.name NOT IN ( SELECT ti.name /*COLLATE*/ FROM #tmp ti
         WHERE NOT EXISTS (SELECT * FROM sysobjects oi
                           WHERE oi.id = ti.id))
ORDER BY Priority ASC

Note: If you use a non-standard collation in any of your databases, you will need to replace /* COLLATE */ with your database collation. i.e. COLLATE Latin1_General_CI_AI

0
जोड़ा
बहुत उपयोगी लिपि, धन्यवाद।
जोड़ा लेखक pmcilreavy, स्रोत

आपने अपने लक्षित पर्यावरण या बाधाओं के बारे में किसी भी विशिष्टता का उल्लेख नहीं किया है, इसलिए यह पूरी तरह से लागू नहीं हो सकता है ... लेकिन यदि आप एक विकसित डीबी स्कीमा को प्रभावी रूप से ट्रैक करने के लिए एक तरीका ढूंढ रहे हैं और उपयोग करने के विचार के विपरीत नहीं हैं रूबी, ActiveRecord की माइग्रेशन आपकी गली ठीक है।

माइग्रेशन प्रोग्रामिंग रूप से रूबी डीएसएल का उपयोग करके डेटाबेस ट्रांसफॉर्मेशन को परिभाषित करता है; प्रत्येक परिवर्तन को लागू किया जा सकता है या (आमतौर पर) वापस लुढ़काया जा सकता है, जिससे आप किसी भी समय दिए गए बिंदु पर अपने डीबी स्कीमा के एक अलग संस्करण पर जा सकते हैं। इन परिवर्तनों को परिभाषित करने वाली फ़ाइल को स्रोत नियंत्रण में किसी भी अन्य स्रोत कोड की तरह जांच किया जा सकता है।

चूंकि माइग्रेशन ActiveRecord का हिस्सा हैं, इसलिए उन्हें आम तौर पर पूर्ण-स्टैक रेल ऐप्स में उपयोग मिलता है; हालांकि, आप कम से कम प्रयास के साथ रेल के सक्रिय ActiveRecord का उपयोग कर सकते हैं। एआर के उपयोग के अधिक विस्तृत उपचार के लिए यहां देखें रेल के बाहर माइग्रेशन।

0
जोड़ा

यह विकास के आसपास "कठोर समस्याओं" में से एक है। जहां तक ​​मुझे पता है कि कोई सही समाधान नहीं है।

If you only need to store the database structure and not the data you can export the database as SQL queries. (in Enterprise Manager: Right click on database -> Generate SQL script. I recommend setting the "create one file per object" on the options tab) You can then commit these text files to svn and make use of svn's diff and logging functions.

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

यदि आपको सभी डेटा भी रखने की आवश्यकता है, तो मैं डेटाबेस का बैक अप लेने और Redgate का उपयोग करने की सलाह देता हूं ( http : //www.red-gate.com/ ) तुलना करने के लिए उत्पाद। वे सस्ते नहीं आते हैं, लेकिन वे हर पैसा लायक हैं।

0
जोड़ा
@Tichman: DataGrove SQL सर्वर का समर्थन नहीं करता प्रतीत होता है, और इस तरह के प्रश्न के लिए कोई प्रासंगिकता नहीं है।
जोड़ा लेखक Neolisk, स्रोत
यदि आप "प्रति फ़ाइल एक ऑब्जेक्ट" विकल्प का उपयोग करते हैं, तो आप डेटाबेस स्क्रिप्ट को चलाने के लिए किस आदेश को काम करते हैं?
जोड़ा लेखक Jamie Kitson, स्रोत
डेटा के संबंध में - आप अपने संपूर्ण डीबी (डेटा शामिल) के संस्करणों को सहेजने के लिए ऑफ़स्केल डेटाग्रोव का उपयोग कर सकते हैं। बाद में आप इसे अपने डीबी की दो वर्चुअल प्रतियों को बढ़ाने के लिए उपयोग कर सकते हैं, जिसे लाल-द्वार के उत्पाद से तुलना की जा सकती है। यह आपको टेस्ट डेटा जेनरेट करने की आवश्यकता भी बचाता है - आप डीबी के संस्करणों को अलग-अलग टेस्ट-केस (फिर से, पूरी डीबी की पूर्ण, आभासी प्रतियां) से मेल खाने के लिए सहेज सकते हैं।
जोड़ा लेखक Taichman, स्रोत

सामान्य समाधान डेटाबेस को आवश्यकतानुसार डंप करना और उन फ़ाइलों को बैकअप देना है।

आपके विकास प्लेटफॉर्म के आधार पर, ओपनसोर्स प्लगइन्स उपलब्ध हो सकते हैं। ऐसा करने के लिए अपना खुद का कोड रोल करना आम तौर पर काफी छोटा होता है।

नोट: आप इसे संस्करण नियंत्रण में डालने के बजाय डेटाबेस डंप बैकअप लेना चाह सकते हैं। फ़ाइलों को संस्करण नियंत्रण में बहुत तेज हो सकता है, और आपके पूरे स्रोत नियंत्रण प्रणाली को धीमा होने का कारण बनता है (मैं इस समय एक सीवीएस डरावनी कहानी याद कर रहा हूं)।

0
जोड़ा

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

लेकिन, वह मॉडल बहुत बड़े या तीसरे पक्ष के डेटाबेस (जो ऑब्जेक्ट एन्क्रिप्ट करता है) फिट नहीं है। तो, हमने जो कुछ किया है वह केवल हमारी अनुकूलित वस्तुओं को स्टोर करना है। विजुअल स्टूडियो / टीम फाउंडेशन सर्वर इसके लिए बहुत अच्छा काम करता है।

TFS डेटाबेस मुख्य संग्रह। ब्लॉग

एमएस टीएफएस साइट

0
जोड़ा

रेड गेट के एसक्यूएल उत्पाद की तुलना न केवल आपको ऑब्जेक्ट-स्तरीय तुलना करने की अनुमति देता है, और उसमें परिवर्तन स्क्रिप्ट उत्पन्न करता है, लेकिन यह आपको ऑब्जेक्ट प्रकार द्वारा व्यवस्थित फ़ोल्डर पदानुक्रम में एक [ऑब्जेक्टनाम]। एसक्यूएल सृजन के साथ अपने डेटाबेस ऑब्जेक्ट्स को निर्यात करने की अनुमति देता है। इन निर्देशिकाओं में प्रति वस्तु स्क्रिप्ट। वस्तु-प्रकार पदानुक्रम इस तरह है:

\ कार्य
\ सुरक्षा
\ सुरक्षा \ भूमिकाओं
\ सुरक्षा \ स्कीमा
\ सुरक्षा \ उपयोगकर्ता
\ संग्रहीत प्रक्रियाओं
\ टेबल्स

यदि आप परिवर्तन करने के बाद अपनी स्क्रिप्ट को उसी रूट निर्देशिका में डंप करते हैं, तो आप इसका उपयोग अपने एसवीएन रेपो को अपडेट करने के लिए कर सकते हैं, और प्रत्येक ऑब्जेक्ट का अलग-अलग इतिहास अलग-अलग रख सकते हैं।

0
जोड़ा
हमने अभी एसक्यूएल सोर्स कंट्रोल जारी किया है, जो एसएसएमएस में वर्णित एसक्यूएल तुलना व्यवहार को एकीकृत करता है, और एसवीएन और टीएफएस के लिंक। मैंने इस प्रश्न का एक अलग उत्तर जोड़ा है जो वर्णन करता है कि यह क्या करता है। red-gate.com/products/SQL_Source_Control/index.htm
जोड़ा लेखक David Atkinson, स्रोत

कुछ समय पहले मुझे एक वीबी बेस मॉड्यूल मिला जो डीएमओ और वीएसएस ऑब्जेक्ट्स का इस्तेमाल करता था ताकि एक संपूर्ण डीबी स्क्रिप्ट बंद हो और वीएसएस में हो सके। मैंने इसे एक वीबी स्क्रिप्ट में बदल दिया और इसे यहां पोस्ट किया। आप आसानी से वीएसएस कॉल निकाल सकते हैं और सभी स्क्रिप्ट उत्पन्न करने के लिए डीएमओ सामान का उपयोग कर सकते हैं, और उसके बाद उसी बैच फ़ाइल से एसवीएन को कॉल कर सकते हैं जो वीबीस्क्रिप्ट को इन्हें जांचने के लिए कहता है?

डेव जे

0
जोड़ा

आप लिक्विबेस ( http://www.liquibase.org/ ) पर देखना चाहेंगे। यहां तक ​​कि यदि आप टूल का उपयोग नहीं करते हैं, तो यह डेटाबेस परिवर्तन प्रबंधन की अवधारणाओं को नियंत्रित करता है या बहुत अच्छी तरह से पुन: सक्रिय करता है।

0
जोड़ा
हम निरंतर वितरण के लिए एक शाखा पर 5 वितरित टीमों में लिक्विबेस का उपयोग करते हैं और यह बहुत अच्छा काम कर रहा है। हमारे पास कई अलग-अलग वातावरण पर 10+ डेटाबेस एप्लिकेशन इंस्टॉल हैं। हम स्कीमा, अनुक्रमण, विभाजन, कोड, लुकअप डेटा, समूह और समूह अनुमतियों का प्रबंधन करने के लिए इसका उपयोग करते हैं। हम इसे ओरेकल, पोस्टग्रेस्क्ल और एमएसएसक्यूएल के लिए उपयोग करते हैं।
जोड़ा लेखक Peter Henell, स्रोत
यदि मैं परिचय के आधार पर सही ढंग से समझता हूं, तो आपको एसक्यूएल की बजाय अपनी ऑब्जेक्ट्स घोषित करने के लिए कुछ स्वामित्व वाली एक्सएमएल भाषा की आवश्यकता है? एक भी पंखा नहीं।
जोड़ा लेखक JDPeckham, स्रोत

चूंकि हमारे ऐप को कई आरडीबीएमएस में काम करना पड़ता है, इसलिए हम डेटाबेस-तटस्थ टोक़ </का उपयोग कर संस्करण नियंत्रण में हमारी स्कीमा परिभाषा को संग्रहीत करते हैं। ए> प्रारूप (एक्सएमएल)। हम xml प्रारूप में हमारे डेटाबेस के संदर्भ डेटा को संस्करण-नियंत्रण भी निम्नानुसार करते हैं (जहां "रिलेशनशिप" संदर्भ तालिका में से एक है):

  
  
  etc.

इसके बाद हम स्कीमा अपग्रेड और संदर्भ डेटा अपग्रेड स्क्रिप्ट उत्पन्न करने के लिए घर से उगाए गए टूल का उपयोग करते हैं जिन्हें डेटाबेस के संस्करण एक्स से संस्करण X + 1 में जाने की आवश्यकता होती है।

0
जोड़ा

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

मुझे लगता है कि प्रत्येक डेवलपर के लिए एक अलग डेटाबेस होना महत्वपूर्ण है और साझा डेटाबेस का उपयोग नहीं करना महत्वपूर्ण है। इस तरह डेवलपर्स अन्य डेवलपर्स से परीक्षण मामलों और विकास चरणों को स्वतंत्र रूप से बना सकते हैं।

स्वचालित उपकरण का डेटाबेस डेटाबेस मेटाडेटा को संभालने के लिए साधन होना चाहिए, जो बताता है कि कौन से डेटाबेस विकास की स्थिति में हैं और कौन सी तालिकाओं में संस्करण नियंत्रण योग्य डेटा है और इसी तरह।

0
जोड़ा

अतिरिक्त अनुशंसा और एक चेतावनी के साथ, रेडगेट टूल्स की सिफारिश की गई हर किसी के लिए +1।

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

एक चेतावनी यह है कि एक पटकथा समाधान या अन्यथा, रेडगेट उपकरण पर्याप्त रूप से चिकनी हैं कि एसक्यूएल वास्तविकताओं के बारे में भूलना आसान है। यदि आप किसी तालिका में सभी कॉलम का नाम बदलते हैं, तो SQLCompare के पास पुराने कॉलम को नए कॉलम में मैप करने का कोई तरीका नहीं है और तालिका में सभी डेटा छोड़ देंगे। यह चेतावनियां उत्पन्न करेगा लेकिन मैंने देखा है कि लोग उस पर क्लिक करते हैं। मुझे लगता है कि बनाने के लायक एक सामान्य बिंदु है, मुझे लगता है कि आप केवल डीबी संस्करण को स्वचालित कर सकते हैं और अपग्रेड कर सकते हैं - abstractions बहुत कमजोर हैं।

0
जोड़ा
यह ध्यान में रखना महत्वपूर्ण है कि डेटाबेस परिवर्तनों के लिए अस्पष्टता है (और इसलिए "डेवलपर इरादे" के तत्व की आवश्यकता है), एक माइग्रेशन-आधारित समाधान उपयुक्त समाधान है। Redgate में अब ReadyRoll है जो इस संस्करण दृष्टिकोण को संतुष्ट करता है।
जोड़ा लेखक David Atkinson, स्रोत
तो एक ऐसी प्रणाली होनी चाहिए जो ट्रैक करे कि आप कौन से कॉलम बदल रहे हैं और पुराने कॉलम नामों से मैपिंग को नए कॉलम नामों में याद रखें।
जोड़ा लेखक Silvercode, स्रोत

मेरे अनुभव में समाधान दो गुना है:

  1. विकास के दौरान कई डेवलपर्स द्वारा किए गए विकास डेटाबेस में परिवर्तनों को संभालने की आवश्यकता है।

  2. आपको ग्राहकों की साइटों में डेटाबेस उन्नयन को संभालने की आवश्यकता है।

# 1 को संभालने के लिए आपको एक मजबूत डेटाबेस diff / मर्ज टूल की आवश्यकता होगी। सबसे अच्छा टूल स्वचालित रूप से जितना संभव हो सके स्वचालित विलय करने में सक्षम होना चाहिए जबकि आपको मैन्युअल रूप से अनचाहे संघर्षों को हल करने की अनुमति मिलती है।

सही उपकरण को 3-तरफा मर्ज एल्गोरिदम का उपयोग करके मर्ज ऑपरेशंस को संभालना चाहिए जो BASE डेटाबेस के सापेक्ष, THEIRS डेटाबेस और MINE डेटाबेस में किए गए परिवर्तनों को ध्यान में रखता है।

I wrote a commercial tool that provides manual merge support for SQLite databases and I'm currently adding support for 3-way merge algorithm for SQLite. Check it out at http://www.sqlitecompare.com

# 2 को संभालने के लिए आपको जगह में अपग्रेड फ्रेमवर्क की आवश्यकता होगी।

मूलभूत विचार एक स्वचालित अपग्रेड फ्रेमवर्क विकसित करना है जो जानता है कि किसी मौजूदा SQL स्कीमा से नए SQL स्कीमा में अपग्रेड कैसे करें और प्रत्येक मौजूदा डीबी स्थापना के लिए अपग्रेड पथ बनाएं।

इस विषय पर http://www.codeproject.com/KB/ में विषय पर मेरा आलेख देखें डेटाबेस / sqlite_upgrade.aspx के बारे में एक सामान्य विचार प्राप्त करने के लिए जो मैं बात कर रहा हूं।

शुभ लाभ

लिरॉन लेवी

0
जोड़ा

मैं ईएसवी उत्तर से सहमत हूं और उस सटीक कारण के लिए मैंने थोड़ी देर पहले एक छोटी सी परियोजना शुरू की ताकि डेटाबेस अपडेट को एक बहुत ही सरल फ़ाइल में बनाए रखने में मदद मिल सके जिसे बाद में एक लंबे समय तक स्रोत कोड बनाए रखा जा सके। यह डेवलपर्स के साथ-साथ यूएटी और उत्पादन के लिए आसान अपडेट की अनुमति देता है। उपकरण पर काम करता है लेकिन एसक्यूएल सर्वर और MySQL।

कुछ परियोजना विशेषताएं:

  • स्कीमा परिवर्तनों की अनुमति देता है
  • मूल्य वृक्ष आबादी की अनुमति देता है
  • उदाहरण के लिए अलग-अलग परीक्षण डेटा प्रविष्टियों की अनुमति देता है। UAT
  • रोलबैक (स्वचालित नहीं) के विकल्प को अनुमति देता है
  • SQL सर्वर और MySQL
  • के लिए समर्थन बनाए रखता है
  • आपके मौजूदा डेटाबेस को संस्करण नियंत्रण में एक साधारण कमांड के साथ आयात करने की क्षमता है (केवल SQL सर्वर ... अभी भी MySQL पर काम कर रहा है)

कोड को Google कोड पर होस्ट किया गया है। कृपया कुछ और जानकारी के लिए Google कोड देखें

http://code.google.com/p/databaseversioncontrol/

0
जोड़ा

यह एक बहुत पुराना सवाल है, हालांकि कई अभी भी इसे हल करने की कोशिश कर रहे हैं। उन्हें केवल विजुअल स्टूडियो डाटाबेस प्रोजेक्ट्स के बारे में शोध करना है। इसके बिना, कोई भी डेटाबेस विकास बहुत कमजोर दिखता है। कोड संगठन से लेकर तैनाती तक संस्करण तक, यह सब कुछ सरल बनाता है।

0
जोड़ा

सबसे पहले, आपको संस्करण नियंत्रण प्रणाली चुननी होगी जो आपके लिए सही है:

  • केंद्रीकृत संस्करण नियंत्रण प्रणाली - एक मानक प्रणाली जहां उपयोगकर्ता फ़ाइलों पर काम करने से पहले / बाद में चेक / चेक करते हैं, और फ़ाइलों को एक केंद्रीय सर्वर में रखा जा रहा है

  • वितरित संस्करण नियंत्रण प्रणाली - एक प्रणाली जहां भंडार को क्लोन किया जा रहा है, और प्रत्येक क्लोन वास्तव में भंडार का पूर्ण बैकअप है, इसलिए यदि कोई सर्वर क्रैश हो जाता है, तो किसी भी क्लोन रिपोजिटरी का उपयोग इसे पुनर्स्थापित करने के लिए किया जा सकता है अपनी जरूरतों के लिए सही प्रणाली चुनने के बाद, आपको रिपोजिटरी सेट अप करने की आवश्यकता होगी जो प्रत्येक संस्करण नियंत्रण प्रणाली का मूल है यह सब निम्नलिखित आलेख में समझाया गया है: http://solutioncenter.apexsql.com/sql-server-source-control-part-i-understanding-source-control-basics/

एक भंडार स्थापित करने के बाद, और केंद्रीय संस्करण नियंत्रण प्रणाली के मामले में एक कार्यशील फ़ोल्डर के मामले में, आप यह आलेख । यह दिखाता है कि विकास पर्यावरण में स्रोत नियंत्रण कैसे सेट करें:

  • एमएसएससीसीआई प्रदाता के माध्यम से एसक्यूएल सर्वर प्रबंधन स्टूडियो,

  • विजुअल स्टूडियो और SQL सर्वर डेटा टूल्स

  • एक तृतीय पक्ष उपकरण ApexSQL स्रोत नियंत्रण
0
जोड़ा

I would suggest using comparison tools to improvise a version control system for your database. A good alternative are xSQL Schema Compare and xSQL Data Compare.

अब, यदि आपका लक्ष्य केवल संस्करण नियंत्रण के तहत डेटाबेस की स्कीमा है, तो आप स्कीमा के xSQL स्नैपशॉट जेनरेट करने के लिए एक्सएसक्यूएल स्कीमा तुलना का उपयोग कर सकते हैं और इन फ़ाइलों को अपने संस्करण नियंत्रण में जोड़ सकते हैं। किसी विशेष संस्करण में वापस करने या अपडेट करने के लिए, गंतव्य संस्करण के स्नैपशॉट के साथ डेटाबेस के वर्तमान संस्करण की तुलना करें।

हां, यदि आप संस्करण नियंत्रण के तहत भी डेटा रखना चाहते हैं, तो आप अपने डेटाबेस के लिए परिवर्तन स्क्रिप्ट उत्पन्न करने के लिए xSQL डेटा तुलना का उपयोग कर सकते हैं और अपने संस्करण नियंत्रण में .sql फ़ाइलों को जोड़ सकते हैं। फिर आप इन स्क्रिप्ट को अपने इच्छित संस्करण में वापस / अपडेट करने के लिए निष्पादित कर सकते हैं। ध्यान रखें कि 'रिवर्ट' कार्यक्षमता के लिए आपको परिवर्तन स्क्रिप्ट उत्पन्न करने की आवश्यकता होती है, जब निष्पादित होने पर संस्करण 3 को संस्करण 2 के समान और 'अपडेट' कार्यक्षमता के लिए, आपको विपरीत स्क्रिप्ट उत्पन्न करने की आवश्यकता होती है जो विपरीत होती है।

अंत में, कुछ बुनियादी बैच प्रोग्रामिंग कौशल के साथ आप xSQL स्कीमा तुलना और xSQL डेटा तुलना के कमांड लाइन संस्करणों का उपयोग करके पूरी प्रक्रिया को स्वचालित कर सकते हैं

अस्वीकरण: मैं xSQL से संबद्ध हूं।

0
जोड़ा