मैं दो डेटाबेस के स्कीमा की तुलना कैसे कर सकता हूं?


19

क्या दो SQL सर्वर डेटाबेस (केवल स्कीमा) में अंतर खोजने का एक तरीका है। एक स्थानीय है और दूसरा ग्राहक की साइट पर है। हम कुछ रिपोर्टों और कुछ कोड को निष्पादित नहीं करने वाली क्रिस्टल रिपोर्ट के साथ समस्याओं का सामना कर रहे हैं और ऐसा प्रतीत होता है कि स्कीमा मैच नहीं करते हैं।

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


एसओ के इस सवाल पर कुछ अच्छे सुझाव हैं।
लोवलीडा

जवाबों:


13

यदि आप कनेक्टिविटी समस्याओं के कारण वहां से कई उपकरणों का उपयोग नहीं कर सकते हैं और "ऑफ़लाइन" तुलना चाहते हैं, तो आप डेटाबेस पर राइट क्लिक करके और "कार्य ... / उत्पन्न करें" का उपयोग करके सभी डेटाबेस ऑब्जेक्ट के लिए स्क्रिप्ट उत्पन्न करने के लिए SSMS का उपयोग कर सकते हैं। स्क्रिप्ट "फ़ंक्शन, और सुनिश्चित करें कि आप प्रति ऑब्जेक्ट एक फ़ाइल बनाने के लिए चयन करते हैं।

जब आपने दोनों डेटाबेस के लिए ऐसा कर लिया है, तो दो अलग-अलग फ़ोल्डरों में एक स्थानीय मशीन पर स्क्रिप्ट के दो सेट प्राप्त करें और दोनों की तुलना करने के लिए WinMerge (या समान) का उपयोग करें।


6

एक अन्य विकल्प विजुअल स्टूडियो के एक्सटेंशन SQL सर्वर डेटा टूल्स (SSDT) ​​का उपयोग करना है। आप अपने डेटाबेस स्कीमा को एक .dacpac फ़ाइल के रूप में निकाल सकते हैं और दूसरे .dacpac फ़ाइल या मौजूदा डेटाबेस के साथ तुलना कर सकते हैं। SSDT SQL सर्वर 2012 क्लाइंट टूल के साथ शामिल है, जो इसे बहुत सुलभ बनाता है। आप MSDN साइट पर तुलना को चलाने के लिए पूर्ण निर्देश पा सकते हैं ।


6

इस समान कार्य को करने के लिए एक आसान तरीके से संघर्ष करने के बाद - देखें कि 2 मॉडलों के बीच क्या बदला है, मैंने निम्नलिखित एसक्यूएल स्क्रिप्ट लिखी है जो नए और हटाए गए स्तंभों को निर्धारित करने के लिए दो स्कीमाओं की तुलना करेगी

set nocount on;
-- Set the two variables newmodel and oldmodel to the appropriate database names and execute the script

declare @newmodel varchar(50), @oldmodel varchar(50);

Set @newmodel = '[NewModel to Compare]';
set @oldmodel = '[OldModel to Compare]';


Declare @Temp table (TABLE_SCHEMA varchar(40), TABLE_NAME varchar(40), COLUMN_NAME varchar(50), ORDINAL_POSITION int, IS_NULLABLE varchar(5), NullChange varchar(5), Comment varchar(50));

Declare @script varchar(5000);


set @script = '
Select nc.TABLE_SCHEMA, nc.TABLE_NAME, nc.COLUMN_NAME, nc.ORDINAL_POSITION, nc.IS_NULLABLE, IIF(nc.IS_NULLABLE <> oc.IS_NULLABLE, ''Yes'', ''No''), 
        IIF(oc.COLUMN_NAME IS NULL, convert(varchar(20), ''ADDED COLUMN''), convert(varchar(20), ''--'')) as Comment
    from {NEW}.INFORMATION_SCHEMA.COLUMNS nc
        LEFT join {OLD}.INFORMATION_SCHEMA.COLUMNS oc 
            on nc.TABLE_NAME = oc.TABLE_NAME and nc.COLUMN_NAME = oc.COLUMN_NAME
UNION ALL
    Select oc.TABLE_SCHEMA, oc.TABLE_NAME, oc.COLUMN_NAME, oc.ORDINAL_POSITION, oc.IS_NULLABLE, ''No'', ''DELETED COLUMN'' as Comment
    from {OLD}.INFORMATION_SCHEMA.COLUMNS oc
    where CONCAT(oc.TABLE_NAME, ''.'', oc.COLUMN_NAME) 
        not in (Select CONCAT(TABLE_NAME, ''.'', COLUMN_NAME) from {NEW}.INFORMATION_SCHEMA.COLUMNS)
';


Set @script = replace(@script, '{OLD}', @oldmodel);
Set @script = replace(@script, '{NEW}', @newmodel);

--print @script

Insert into @Temp
    exec(@script);

Select * from @Temp where Comment <> '--'
order by TABLE_NAME, ORDINAL_POSITION, COLUMN_NAME;
go

एक त्वरित और गंदे समाधान के लिए किसी अतिरिक्त सॉफ़्टवेयर की आवश्यकता नहीं है, यह बहुत अच्छा है! यह वही है जो मुझे चाहिए था। धन्यवाद!
मीर

2

यदि आपको एक से अधिक डेटाबेस फ़ाइल की तुलना करने की आवश्यकता है तो आप स्क्रिप्ट कर सकते हैं SQLPackage.exe

मेरे पास आपके लिए काम करने का कोड नहीं है, लेकिन आप कुछ प्रेरणा के लिए SQLPackage.exe प्रलेखन देख सकते हैं ।

आप अपने मास्टर डेटाबेस को dacpac फ़ाइल में निकालेंगे और फिर dacpac फ़ाइल की तुलना अपने बाकी डेटाबेस से करेंगे। तुलना का परिणाम या तो परिवर्तनों की एक xml रिपोर्ट हो सकता है या एक .sql फ़ाइल जिसे आप डेटाबेस को सिंक्रनाइज़ करने के लिए चला सकते हैं।

कुछ इस तरह:

sqlpackage.exe /a:Extract /scs:Server=MyLaptopSQL2014;Database=Test; /tf:C:UsersKevin3NFDocumentsSQLScriptsDACPACSTest.dacpac  

और फिर

sqlpackage.exe /a:Script /sf:C:UsersKevin3NFDocumentsSQLScriptsDACPACSTest.dacpac /tsn:MyLaptopSQL2014 /tdn:Test1 /op:C:UsersKevin3NFDocumentsSQLScriptsDACPACSDeltasTest1.sql /p:DropObjectsNotInSource=True /p:DropIndexesNotInSource=True 
 sqlpackage.exe /a:Script /sf:C:UsersKevin3NFDocumentsSQLScriptsDACPACSTest.dacpac /tsn:MyLaptopSQL2014 /tdn:Test2 /op:C:UsersKevin3NFDocumentsSQLScriptsDACPACSDeltasTest2.sql /p:DropObjectsNotInSource=True /p:DropIndexesNotInSource=True 

आप इस लेख या नमूना कोड के लिए इस पर एक नज़र डाल सकते हैं ।


1

"SQL सर्वर तुलना" के लिए एक खोज करें और आपको बहुत सारे टूल मिलेंगे। हम अपनी नौकरी में जो उपयोग करते हैं, वह Red Gate SQLCompare है । इसका 14 दिन का ट्रायल है। लेकिन जब से आप दो अलग-अलग परिवेशों के बारे में बात कर रहे हैं, मुझे नहीं लगता कि यह आपके लिए काम करेगा, जब तक कि ग्राहक आपको उनके डीबी का बैकअप नहीं भेजता। अन्य विकल्प सिस्टम तालिकाओं (जैसे sys.indexes, sys.tables, आदि) के विरुद्ध क्वेरी लिखना है।


यदि आपके पास दोनों सर्वरों के लिए लॉगिन है तो SQL तुलना ठीक काम करती है। आप प्रत्येक डीबी के लिए एक अलग लॉगिन का उपयोग कर सकते हैं, इसलिए क्लाइंट को यह सुनिश्चित करना होगा कि आपके पास पहुंच थी।
मार्क सिनकिंसन

1

सबसे आसान तरीका इस उद्देश्य के लिए निर्मित स्वचालित उपकरण का उपयोग करना है , लेकिन यदि आपके पास एक तक पहुंच नहीं है, तो आप उन सभी बुनियादी जानकारी प्राप्त कर सकते हैं जिनकी आपको INFORMATION_SCHEMAविचारों से आवश्यकता है ।

मेटाडेटा का उपयोग करना INFORMATION_SCHEMAसंभवत: डीडीएल स्क्रिप्ट बनाने और स्रोत तुलना करने की तुलना में एक आसान विकल्प है क्योंकि आपके पास डेटा को प्रस्तुत करने के तरीके पर अधिक नियंत्रण है। आप वास्तव में उस आदेश को नियंत्रित नहीं कर सकते हैं जिसमें उत्पन्न स्क्रिप्ट एक डेटाबेस में वस्तुओं को प्रस्तुत करेगी। इसके अलावा, स्क्रिप्ट में पाठ का एक समूह होता है जो कि डिफ़ॉल्ट रूप से कार्यान्वयन पर निर्भर हो सकता है और बहुत अधिक बेमेल "शोर" का कारण बन सकता है जब आपको वास्तव में जिस पर ध्यान केंद्रित करने की आवश्यकता होती है वह एक लापता तालिका, दृश्य या स्तंभ, या संभवतः स्तंभ डेटा प्रकार है या आकार बेमेल।

अपने कोड को INFORMATION_SCHEMAविचारों से संबंधित जानकारी प्राप्त करने और SSMS से प्रत्येक SQL सर्वर पर चलाने के लिए एक क्वेरी (या क्वेरीज़) लिखें । फिर आप परिणामों को फ़ाइल में डंप कर सकते हैं और टेक्स्ट फ़ाइल तुलना टूल (यहां तक ​​कि एमएस वर्ड) का उपयोग कर सकते हैं या आप बेमेल परिणामों को खोजने के लिए तालिकाओं और SQL क्वेरीज़ को चलाने के लिए डंप कर सकते हैं।


1

मैं एक नए प्रश्न के लिए इस उत्तर को शामिल कर रहा हूं जिसे एक डुप्लिकेट के रूप में चिह्नित किया गया था।

मुझे एक बार दो प्रोडक्शन डेटाबेस की तुलना करनी पड़ी और उनके बीच कोई स्कीमा अंतर पता चला। ब्याज की एकमात्र वस्तुएं टेबल थीं जिन्हें जोड़ा या गिरा दिया गया था और जो कॉलम जोड़े गए थे, हटा दिए गए थे, या बदल दिए गए थे। मेरे पास अब मेरे द्वारा विकसित एसक्यूएल स्क्रिप्ट नहीं हैं, लेकिन सामान्य रणनीति क्या है। और डेटाबेस SQL ​​सर्वर नहीं था, लेकिन मुझे लगता है कि एक ही रणनीति लागू होती है।

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

इसके बाद, मैंने स्क्रिप्ट्स का विकास किया, जो मेटाडेटाबेस के उपयोगकर्ता तालिकाओं में आवेषण के साथ उत्पादन डेटाबेस के सिस्टम तालिकाओं से चयन करता है।

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

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

मेटाडेटाबेस के मॉडल को सिस्टम तालिकाओं द्वारा प्रश्न में सुझाया गया था। प्रश्नों का निर्माण कठिन नहीं था, समूह के चारों ओर घूमना और गणना (डेटाबेस नाम) = 1 होना।

आपके मामले में, 700 उत्पादन डेटाबेसों के साथ, आप तुलना करने के लिए सिर्फ दो डेटाबेसों के साथ पहले दो चरणों को और अधिक स्वचालित करना चाह सकते हैं। लेकिन विचार समान है।


1

मेरा यह वही सवाल था और मुझे विश्वास है कि Microsoft SQL सर्वर प्रबंधन स्टूडियो (SSMS) के पास हमारे द्वारा देखे गए किसी भी चीज़ से ज्यादा आसान / सरल समाधान है। मेरे पास MS SQL सर्वर एक्सप्रेस के साथ एक उत्पादन साइट है और जल्द ही और भी कई जगह हैं जहाँ मैं VisualStudio या SSMS के अलावा अन्य अनुप्रयोगों को स्थापित करना नहीं चाहता।

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

Presto! वास्तविक तुलना करने की तुलना में इसे लिखना काफी कठिन था।


0

एक महान उपकरण जिसका मैं उपयोग करता हूं (हालांकि थोड़ी देर में अभी भी काम नहीं किया गया है) AdeptSqlDiff है

क्या स्कीमा दोनों तुलना के साथ-साथ डेटा तुलना भी करता है। रेडगेट की तरह ही इसकी भी कीमत है, लेकिन 30 दिन का ट्रायल भी है। और कीमत बहुत उचित है।


0

शायद यह मुफ्त स्क्रिप्ट https://github.com/dlevsha/compalex आपकी मदद कर सकती है। यह Microsoft SQL सर्वर का समर्थन करता है।

Compalex दो डेटाबेस स्कीमा की तुलना करने के लिए एक निशुल्क हल्की स्क्रिप्ट है। यह MySQL, MS SQL Server और PostgreSQL को सपोर्ट करता है।

आप यहां डेमो की कोशिश कर सकते हैं

http://demo.compalex.net/


0

वहाँ कई तीसरे पक्ष के उपकरण हैं जो स्कीमा और डेटा की तुलना, और तुल्यकालन करेंगे। दो उपकरण जो आप उपयोग कर सकते हैं वे हैं मेरी टीम और मैंने विकसित किया है, xSQL स्कीमा स्कीमा तुलना के लिए तुलना करें और xSQL डेटा समान स्कीमा के साथ वस्तुओं के बीच डेटा तुलना के लिए तुलना करें । उम्मीद है की यह मदद करेगा!
अस्वीकरण: मैं xSQL से संबद्ध हूं


0

बाजार पर बहुत सारे उपकरण हैं जिनका उपयोग आप काम पाने के लिए कर सकते हैं। मेरी कंपनी ApexSQL Diff का उपयोग तुलना और सिंक दोनों के लिए कर रही है क्योंकि यह Azure के लिए मुफ़्त है, लेकिन आप Devart या Redgate टूल के साथ गलत नहीं कर सकते।


0

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


0

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


-1

इसकी जांच करें:

SELECT TABLE_SCHEMA ,
       TABLE_NAME ,
       COLUMN_NAME ,
       ORDINAL_POSITION ,
       COLUMN_DEFAULT ,
       DATA_TYPE ,
       CHARACTER_MAXIMUM_LENGTH ,
       NUMERIC_PRECISION ,
       NUMERIC_PRECISION_RADIX ,
       NUMERIC_SCALE ,
       DATETIME_PRECISION
FROM   INFORMATION_SCHEMA.COLUMNS
where TABLE_SCHEMA in ('dbo','meta')
and table_name in (select name from sys.tables)
order by TABLE_SCHEMA ,       TABLE_NAME ,ORDINAL_POSITION

यहाँ छवि विवरण दर्ज करें


3
यह वास्तव में तुलना करने के बारे में होना चाहिए, न कि केवल स्कीमा प्राप्त करना
मार्क सिंकिन्सन

मैं बस इसे यहाँ छोड़ दूंगा यह दूसरों की मदद करता है। इसने मेरी मदद की
जेरेमी थॉम्पसन


-1

DBDiff इसके लिए सबसे अच्छा साधन है, आप इसे यहाँ पा सकते हैं ।


डेटाबेस व्यवस्थापकों में आपका स्वागत है! जैसा कि आप देखते हैं, यहां सभी अच्छी तरह से प्राप्त उत्तर केवल एक लिंक से अधिक हैं । कृपया अपने उत्तर को संपादित करने पर विचार करें और सॉफ़्टवेयर के बारे में अधिक जानकारी जोड़ें, विशेष रूप से यह प्रश्न में आवश्यकताओं को कैसे पूरा करता है।
ग्लोरफाइंडेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.