क्या डेटाबेस परिवर्तन के लिए डेवलपर्स के लिए "सर्वोत्तम-अभ्यास" प्रकार की प्रक्रिया है?


31

विकास से लेकर QA तक उत्पादन वातावरण में DB परिवर्तनों को स्थानांतरित करने का एक अच्छा तरीका क्या है? वर्तमान में हम:

  1. SQL फ़ाइल में परिवर्तन को स्क्रिप्ट करें और उसे TFS कार्य आइटम में संलग्न करें।
  2. कार्य की समीक्षा की जाती है
  3. जब काम परीक्षण के लिए तैयार हो जाता है तो SQL QA पर चलाया जाता है।
  4. काम क्यूए परीक्षण किया है
  5. जब काम उत्पादन के लिए तैयार होता है तो SQL उत्पादन डेटाबेस पर चलाया जाता है।

इसके साथ समस्या यह है कि यह बहुत मैनुअल है। यदि यह डेवलपर भूल जाता है तो यह sql या सहकर्मी-समीक्षक को इसे पकड़ने के लिए याद रखने वाले डेवलपर पर निर्भर करता है। कभी-कभी, यह परीक्षक या QA के लिए मौजूद होता है जो समस्या का पता लगाता है।

एक माध्यमिक समस्या यह है कि आप कभी-कभी परिवर्तनों को मैन्युअल रूप से समन्वित करने की आवश्यकता समाप्त करते हैं यदि दो अलग-अलग कार्य एक ही डेटाबेस ऑब्जेक्ट को बदलते हैं। यह सिर्फ तरीका हो सकता है, लेकिन यह अभी भी लगता है कि इन मुद्दों या कुछ "झंडा" के कुछ स्वचालित तरीके होना चाहिए।

हमारा सेटअप: हमारी विकास की दुकान बहुत सारे डीबी अनुभव वाले डेवलपर्स से भरी हुई है। हमारी परियोजनाएँ बहुत DB उन्मुख हैं। हम मुख्य रूप से एक .NET और MS SQL शॉप हैं। वर्तमान में हम अपने काम को ट्रैक करने के लिए MS TFS कार्य आइटम का उपयोग कर रहे हैं। यह कोड परिवर्तन के लिए आसान है क्योंकि यह परिवर्तन को कार्य आइटम से जोड़ता है ताकि मैं यह पता लगा सकूं कि QA और उत्पादन वातावरण में माइग्रेट करते समय मुझे किन परिवर्तनों को शामिल करने की आवश्यकता है। हम वर्तमान में एक DB परियोजना का उपयोग नहीं कर रहे हैं, लेकिन भविष्य में उस पर स्विच कर सकते हैं (हो सकता है कि उत्तर का हिस्सा हो)।

मैं अपने स्रोत नियंत्रण प्रणाली के लिए बहुत ही अभ्यस्त हूं, जो मेरे लिए इस तरह की चीजों का ख्याल रखता है और मेरी एसक्यूएल के लिए भी यही बात होगी।


एक अच्छा खुला स्रोत परियोजना की तरह लगता है (अगर पहले से मौजूद नहीं है)
पैट्रिक

@ पैट्रिक ... हाँ यह करता है, लेकिन ऐसा लगता है कि सभी एमएस कार्यक्षमता के साथ ऐसा करने का एक तरीका होगा। मुझे घर के प्रोजेक्ट्स के लिए भी OS चाहिए, लेकिन काम के लिए हमारे पास विकास के माहौल में रहना अच्छा होगा।
बेथ व्हाइटजेल

1
मुझे लगता है कि इसके लिए डेटाबेस प्रोजेक्ट अच्छे हैं। वे स्रोत नियंत्रित हो सकते हैं और स्रोत में व्हाट्स के आधार पर स्क्रिप्ट को बदल सकते हैं।

@mrskaggs क्या वे कोड परिवर्तनक की तरह कार्य करते हैं? अगर वे ऐसा करते हैं तो रोमांचक है। (और आपको इसका जवाब देना चाहिए)
बेथ व्हाइटजेल

जवाबों:


17

VS वातावरण में, मैंने हमेशा अद्यतन स्क्रिप्ट को कार्यान्वित करने के लिए डेटाबेस प्रोजेक्ट्स का उपयोग किया है। मैं अपनी स्क्रिप्ट्स के लिए "DatabaseUpdate17.sql" या "PriceUpdateFebdays2010.sql" जैसे अकल्पनीय नामों का उपयोग करता हूं। डेटाबेस प्रोजेक्ट्स के रूप में उनके पास होने से मुझे टीम सर्वर के कामों, बग्स (और अगर हमने कोड की समीक्षा की, तो उन्हें भी) के साथ टाई करने की सुविधा मिलती है। मैं प्रत्येक डेटाबेस (जिसमें मेरा अधिकार है) को विशेष रूप से स्कीमा में परिवर्तन के संग्रह के लिए एक तालिका में शामिल करता है।

CREATE TABLE [dbo].[AuditDDL](
    [EventID] [int] IDENTITY(1,1) PRIMARY KEY NOT NULL,
    [EventData] [xml] NULL,                    -- what did they do
    [EventUser] varchar(100) NOT NULL,         -- who did it
    [EventTime] [datetime] DEFAULT (getdate()) -- when did they do it
    )
GO

खैर, यह 6 Ws में से 3 का ख्याल रखता है ।

CREATE TRIGGER [trgAuditDDL]
ON DATABASE 
FOR DDL_DATABASE_LEVEL_EVENTS 
AS
INSERT INTO AuditDDL(EventData, EventUser)
SELECT EVENTDATA(), original_login()
GO

मैं एक पैच की शुरुआत के साथ-साथ एक पैच के अंत में प्रवेश करने के लिए एक सम्मिलित विवरण शामिल करता हूं। पैच के बाहर होने वाली घटनाओं पर ध्यान देने वाली बातें हैं।

उदाहरण के लिए, "पैच 17" के लिए एक "स्टार्ट पैच" इंसर्ट करना होगा:

INSERT INTO [dbo].[AuditDDL]
           ([EventData]
           ,[EventUser])
     VALUES
           ('<EVENT_INSTANCE><EventType>BEGIN PATCH 17</EventType></EVENT_INSTANCE>'
           ,ORIGINAL_LOGIN())
GO

चूँकि यह तब भी पकड़ा जाता है जब सूचकांक का पुनर्निर्माण किया जाता है, तो आपको उन घटनाओं को समाप्त करने के लिए हर महीने निम्नलिखित को चलाने की आवश्यकता होगी:

DELETE FROM AuditDDL
WHERE [EventData].exist('/EVENT_INSTANCE/EventType/text()[fn:contains(.,"ALTER_INDEX")]') =1
GO

DELETE FROM AuditDDL
WHERE [EventData].exist('/EVENT_INSTANCE/EventType/text()[fn:contains(.,"UPDATE_STATISTICS")]') =1
GO

पहले वाला संस्करण पहले सर्वर फॉल्ट पर पोस्ट किया गया था

SOX और PCI-DSS के अनुरूप वातावरण में, आपको उत्पादन सर्वर तक कभी पहुंच प्राप्त नहीं होगी। इसलिए लिपियों को पहले से स्पष्ट और व्यायाम करने की आवश्यकता है। अद्यतन स्क्रिप्ट के शीर्ष पर टिप्पणियों में नई तालिकाओं, संग्रहीत प्रोक, फ़ंक्शंस इत्यादि की सूची के साथ-साथ संशोधित तालिकाओं, संग्रहीत प्रोक, फ़ंक्शंस आदि की सूचियाँ शामिल हैं। यदि डेटा संशोधित हो जाता है, तो स्पष्ट करें कि क्या संशोधित किया जा रहा है और क्यों।

एक माध्यमिक समस्या यह है कि आप कभी-कभी परिवर्तनों को मैन्युअल रूप से समन्वित करने की आवश्यकता समाप्त करते हैं यदि दो अलग-अलग कार्य एक ही डेटाबेस ऑब्जेक्ट को बदलते हैं। यह सिर्फ तरीका हो सकता है, लेकिन यह अभी भी लगता है कि इन मुद्दों या कुछ "झंडा" के कुछ स्वचालित तरीके होना चाहिए।

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


तो आप वीएस में ऐसा करते हैं न कि एसएसएमएस सही? मैं अभी अपने डेटाबेस के काम के लिए SCM करने का सबसे अच्छा तरीका जानने की कोशिश कर रहा हूं, और हम Hg का उपयोग करते हैं।
jcolebrand

1
@jcolebrand, हां, मैं स्क्रिप्ट लिखने और उसे ट्रैक करने के लिए VS का उपयोग करता हूं। उत्पादन कर्मचारी उत्पादन डेटाबेस को अद्यतन करने के लिए स्क्रिप्ट को चलाने के लिए SSMS का उपयोग करते हैं। वीएस के अंदर डेटाबेस टूल स्कीमा की तुलना करने के लिए काफी सभ्य हैं। RedGate की SQL तुलना एक अच्छा विकल्प है।
तांगुरेना

7

क्या आपने एसक्यूएल सोर्स कंट्रोल को देखा है? आप अपने एसक्यूएल सर्वर को टीएफएस / एसवीएन / वॉल्ट या वीएसएस से जोड़ने के लिए इसका उपयोग कर सकते हैं - http://www.red-gate.com/products/sql-development/sql-source-control/


धन्यवाद, वह वह है जिसे मैंने थोड़ा सा देखा है। अगर हमें यह पसंद नहीं है कि कैसे db प्रोजेक्ट्स VS में काम करते हैं तो लाल-गेट एक अच्छे समाधान की तरह लगता है।
बेथ व्हाइटजेल

4

एक अन्य समाधान अपने डेटाबेस में परिवर्तनों को डिजाइन करने और प्रबंधित करने के लिए पावरडिजाइनर, ईआरविन आदि जैसे कुछ का उपयोग करना है।

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

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

(मैं साइबेस से संबद्ध किसी भी तरह से नहीं हूं, जिन्होंने पावरडिजेनर विकसित किया - बस सोचा कि मैं वहां फेंक दूंगा)।


2

DB भूत

डेटाबेस को प्रबंधित करने के लिए DB घोस्ट मेरा पसंदीदा उपकरण है।

लाभ

  1. आपके डेटाबेस की सभी वस्तुएँ स्रोत नियंत्रण में स्क्रिप्ट के रूप में संग्रहीत की जाती हैं।
  2. आप 'स्थैतिक डेटा' (लुकअप टेबल डेटा) को भी स्क्रिप्ट कर सकते हैं।
  3. आप स्रोत नियंत्रण को मैन्युअल रूप से या 'मॉडल' विकास डेटाबेस को स्क्रिप्ट करके अपडेट कर सकते हैं।
  4. आप कर सकते हैं का निर्माण स्रोत नियंत्रण (स्थिर डेटा सहित) में स्क्रिप्ट से एक डेटाबेस (जल्दी) ।
  5. आप उदाहरणों में परिवर्तन तैनात कर सकते हैं किसी भी उत्पादन उदाहरण सहित डेटाबेस के में :
    • आप एक 'डेटाबेस का निर्माण' (लिपियों से निर्मित) की तुलना मौजूदा डेटाबेस से कर सकते हैं और एक परिवर्तन स्क्रिप्ट उत्पन्न कर सकते हैं।
    • आप डीबी घोस्ट को डेटाबेस के दो उदाहरणों के बीच परिवर्तनों को स्वचालित रूप से सिंक करने के लिए निर्देशित कर सकते हैं, जैसे एक बिल्ड डेटाबेस और आपका प्रोडक्शन डेटाबेस।

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

विवरण

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

स्क्रिप्ट के एक सेट (सेट) के रूप में डेटाबेस का प्रबंधन करने में सक्षम होने और नए उदाहरणों को जल्दी से बनाने में सक्षम होने का एक विशेष परिणाम यह है कि महत्वपूर्ण डेटाबेस कोड का परीक्षण करना बहुत आसान है (और बहुत मजेदार भी)। मैं यूनिट परीक्षण के लिए tSQLt का उपयोग करता हूं

मैं केवल यह चाहता हूं कि अन्य DBMS-s के लिए एक समान उपकरण था।


1

मुझे पता है कि यह अधिकांश डीबीए को ओवरकिल लगता है:

क्या आपने डेटाबेस परिवर्तन (और केवल DB परिवर्तन) को ट्रैक करने के लिए पटरियों पर रूबी का उपयोग करने पर विचार किया है। आपको किसी भी ऐप को चलाने या किसी भी रूबी कोड आदि को लिखने की आवश्यकता नहीं है, लेकिन मुझे माइग्रेशन की शैली मिली (यह है कि वे इसे कैसे कहते हैं) काफी उपयोगी है: http://guides.rubyonrails.org/migrations.html

Sql Server भी समर्थित है, आपको JRuby + JDBC का उपयोग करना पड़ सकता है।


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