आप एक फ़ील्ड बदल सकते हैं और इसे फ़ील्ड की जांच किए बिना शून्य नहीं बना सकते हैं। यदि आप वास्तव में घंटों से इसे न करने के बारे में चिंतित हैं तो आप उस क्षेत्र में बाधा डाल सकते हैं जो यह सुनिश्चित करने के लिए जांच करता है कि यह शून्य नहीं है। यह आपको बिना किसी चेक विकल्प के उपयोग करने की अनुमति देगा, और यह देखने के लिए कि क्या यह अपडेट हो रहा है, यह 4 मिलियन पंक्तियों में से प्रत्येक को चेक नहीं करता है।
- बाधा जो अपडेट होने से किसी भी नई पंक्तियाँ रोकने के लिए और मूल लोगों अनछुए छोड़ देंगे का उपयोग करें:
CREATE TABLE Test
(
T0 INT Not NULL,
T1 INT NUll
)
INSERT INTO Test VALUES(1, NULL) -- Works!
ALTER TABLE Test
WITH NOCHECK
ADD CONSTRAINT N_null_test CHECK (T1 IS NOT NULL)
ALTER COLUMN T1 int NOT NULL
INSERT INTO Test VALUES(1, NULL) -- Doesn't work now!
सच आपके पास दो विकल्प (जोड़ा तीसरा संपादित देखें)।
- उन पंक्तियों को अपडेट करें जो किसी और चीज़ के लिए शून्य हैं और फिर नल ऑल्टर विकल्प लागू करें। यह वास्तव में ऑफ घंटों में चलाया जाना चाहिए, जब तक कि आप टेबल से लॉक होने वाली प्रक्रियाओं को ध्यान में रखते हैं।
आपके विशिष्ट परिदृश्य के आधार पर, विकल्प आपके लिए बेहतर हो सकता है। मैं विकल्प नहीं चुनूंगा क्योंकि आपको इसे बंद घंटे में चलाने की ज़रूरत है। लंबे समय तक, रात के मध्य में अपडेट करने का समय आपके सिरदर्द की तुलना में काफी हद तक खर्च किया जाएगा, जिससे आप कुछ घंटों को बचाने के लिए एक छोटा सा कटौती करके सामना करेंगे।
यह सब कहा जा रहा है, यदि आप विकल्प दो के साथ जाने जा रहे हैं तो आप ऑफ घंटे में किए गए काम की मात्रा को कम कर सकते हैं। क्या आप स्तंभ में फेरबदल से पहले पंक्तियों को रिक्त नहीं अद्यतन सुनिश्चित करने के लिए है के बाद से, आप के लिए धीरे-धीरे (एक ही बार में यह सब कर के सापेक्ष)
- देखने के लिए प्रत्येक पंक्ति
- चेक के माध्यम से जाओ एक कर्सर लिख सकते हैं यदि यह शून्य है
- इसे उचित रूप से अपडेट करें। इसमें कुछ समय लगेगा, लेकिन यह पूरे टेबल को अन्य प्रोग्राम्स को एक्सेस करने से रोक नहीं देगा। (with(rowlock) तालिका संकेत मत भूलना!)
संपादित: आप उचित कॉलम के साथ एक नया टेबल बना सकते हैं, और फिर मूल तालिका से डेटा निर्यात: मैं बस एक तीसरा विकल्प के बारे में सोचा नए के लिए। जब यह किया जाता है, तो आप मूल तालिका को छोड़ सकते हैं और नए के नाम को पुराने होने के लिए बदल सकते हैं। ऐसा करने के लिए आपको मूल पर निर्भरताओं को अक्षम करना होगा और जब आप पूरा कर लेंगे तो उन्हें नए पर बैक अप लेंगे, लेकिन यह प्रक्रिया आपके द्वारा ऑफ़लाइन घंटों में किए जाने वाले काम की मात्रा को बहुत कम कर देगी। यह वही दृष्टिकोण है जो एसक्यूएल सर्वर का उपयोग करता है जब आप प्रबंधन स्टूडियो के माध्यम से टेबल में कॉलम ऑर्डरिंग परिवर्तन करते हैं। इस दृष्टिकोण के लिए, मैं यह सुनिश्चित करने के लिए भाग में सम्मिलित करता हूं कि आप सिस्टम पर पूर्ववत तनाव नहीं डालते हैं और दूसरों को इसे एक्सेस करने से रोकते हैं। फिर ऑफ घंटों पर, आप मूल को छोड़ सकते हैं, दूसरे का नाम बदल सकते हैं, और निर्भरता आदि लागू कर सकते हैं। आपके पास अभी भी कुछ घंटे का काम होगा, लेकिन यह अन्य दृष्टिकोण की तुलना में कम होगा।
sp_rename का उपयोग करने के लिए लिंक।
व्यक्तिगत तौर पर मैं बंद पीक आवर्स को छोड़कर किसी भी समय एक मौजूदा बड़े तालिका में तालिका संरचना में परिवर्तन करते हैं कभी नहीं होगा।यहां तक कि यदि यह काफी तेज़ है, तो यह उपयोगकर्ताओं को उस क्षण में काम करने की प्रक्रिया में कर सकता है जिससे आप समस्याएं बदल सकते हैं। कोई भी बड़ा परिवर्तन एकल उपयोगकर्ता मोड में भी किया जाता है। जब उपयोगकर्ता कुछ भी नहीं कर पा रहे हैं तो दुखी उपयोगकर्ताओं के मुकाबले दुखी उपयोगकर्ताओं के मुकाबले कुछ भी नहीं कर सकता है (पाठ्यक्रम के पहले और बिना चोटी के घंटों के दौरान) कुछ भी नहीं कर सकता है। – HLGEM
क्या आप जिस कॉलम को बदल रहे हैं वह एफके बाधाओं में शामिल है? – onupdatecascade
प्रोफाइलर में एक त्वरित परीक्षण से यह तालिका पर 'एसएच-एम' लॉक लेता है [जो मूल रूप से सब कुछ के साथ असंगत है] (http://msdn.microsoft.com/en-us/library/ms186396.aspx)। इसके बाद यह निर्धारित करने के लिए कि प्रत्येक पंक्तियां मान्य हैं, प्रत्येक पृष्ठ को पढ़ना होगा। –