2013-08-12 7 views
6

मेरे पास मौजूदा प्रविष्टियों के साथ SQL सर्वर में एक मौजूदा तालिका है (वास्तव में 1 मिलियन से अधिक)।मौजूदा SQL सर्वर तालिका में कॉलम जोड़ें - प्रभाव

इस तालिका में अद्यतन हो जाता है, सामने के अंत आवेदन के द्वारा डाला जाता है और एक नियमित आधार पर से चुना। मैं चाहता हूं कि datetime कॉलम उदा। M_DateModified तो जैसे अद्यतन किया जा सकता है कि:

UPDATE Table SET M_DateModified = GETDATE() 

जब भी एक बटन सामने के अंत पर दबाया जाता है और एक संग्रहीत प्रक्रिया कहा जाता हो जाता है। अनुरोध के अनुसार यह कॉलम मौजूदा रिपोर्ट में जोड़ा जाएगा।

मेरी समस्या, और उत्तर यह है। हमारे ऐप की कोर टेबलों में से एक होने के नाते, ALTERING तालिका होगी और अतिरिक्त कॉलम को अन्य मौजूदा प्रश्नों को तोड़ देगा? जाहिर है, आप सभी कॉलम के लिए सभी मान निर्दिष्ट किए बिना किसी तालिका में सम्मिलित नहीं कर सकते हैं, इसलिए कोई भी मौजूदा INSERT प्रश्न तोड़ देंगे (जो एक बड़ी समस्या है)।

किसी भी मदद की बहुत इस समस्या के बारे में सबसे अच्छा समाधान पर सराहना की जाएगी।

+3

यह ** बुरी तरह से डिज़ाइन किए गए ** प्रश्नों को तोड़ देगा - 'चयन * से ....' या 'INSERT' क्वेरी जो स्पष्ट रूप से कॉलम ** की सूची ** को सम्मिलित नहीं करते हैं .... –

+4

आप कहते हैं "* जाहिर है, आप सभी स्तंभों के लिए सभी मान निर्दिष्ट किए बिना तालिका में सम्मिलित नहीं कर सकते हैं"। यह सच नहीं है। – RBarryYoung

+1

ओह, @RBarryYoung मुझे क्षमा करें। मेरा मतलब सरल आवेषण के साथ आपको संदेश मिलेगा "कॉलम नाम या आपूर्ति किए गए मानों की संख्या तालिका परिभाषा से मेल नहीं खाती है।" उदाहरण के लिए यदि आप केवल 5 मानों की आपूर्ति करेंगे जहां तालिका 7 की अपेक्षा करती है? क्षमा करें मेरी नोबनेस, मैं इस पर नया हूं :) – frans

उत्तर

6

सबसे पहले, जैसा कि marc_s कहता है, इसे केवल SELECT * प्रश्नों को प्रभावित करना चाहिए, और यहां तक ​​कि उन सभी को भी प्रभावित नहीं होना चाहिए।

दूसरे, आप केवल एक INSERT पर सभी गैर अशक्त क्षेत्रों निर्दिष्ट करने की आवश्यकता है, इसलिए यदि आप इसे शून्य करने योग्य बनाने के लिए, आप इस बारे में चिंता करने की जरूरत नहीं है। इसके अलावा, एक Created_Date प्रकार स्तंभ के लिए, यह ठेठ =GetDate() के DEFAULT सेटिंग है, जो यह अगर यह निर्दिष्ट नहीं है आप के लिए भर देंगे जोड़ना है।

तीसरा, अगर आप अभी भी अपने मौजूदा कोड आधार को प्रभावित के बारे में चिंतित हैं, तो निम्न कार्य करें:

  1. "physicalTable" की तरह कुछ करने के लिए अपने तालिका का नाम।
  2. उसी तालिका के साथ एक व्यू बनाएं जिसमें आपकी तालिका औपचारिक रूप से थी, जो SELECT .. FROM physicalTable करता है, कॉलम को स्पष्ट रूप से और उसी क्रम में सूचीबद्ध करता है, लेकिन इसमें M_DateModified फ़ील्ड शामिल न करें।
  3. तालिका को सीधे एक्सेस करने के बजाय, अब अपना कोड अनमोडिफाइड छोड़ दें, दृश्य को संदर्भित करें।

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

अंत में, "ModifiedDate" कॉलम इस तरह का एक आम जरूरत है और सबसे अधिक बार एक & सम्मिलित अद्यतन ट्रिगर है कि यह स्वतः निर्धारित जोड़कर, नियंत्रित किया जाता है पहले यह NULL करने योग्य बनाकर तो:

UPDATE t 
SET M_DateModified = GetDate() 
FROM (SELECT * FROM physicalTable y JOIN inserted i ON y.PkId = i.PkId) As t 

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

+0

मैं देखता हूं, बहुत बहुत धन्यवाद। धन्यवाद। – frans

1

यदि नया कॉलम अनिवार्य नहीं है तो आपके पास चिंता करने की कोई बात नहीं है। जब तक आपके पास कुछ knuckleheads नहीं हैं जो कॉलम सूची के बजाय "*" के साथ चयन कथन लिखते हैं।

+0

बहुत अच्छी तरह से हो सकता है कि ऐसे प्रश्न मौजूद हैं। ऐप बहुत बड़ा है। – frans

+2

या अन्य knuckleheads जो 'INSERT INTO dbo.Table VALUES (.....)' लिखते हैं और उपयोग करने के लिए कॉलम की सूची निर्दिष्ट नहीं करते हैं - इन प्रविष्टियों ** ** सभी ब्रेक ** ** यदि आप एक नया कॉलम जोड़ते हैं - अनिवार्य या नहीं .... –

1

ठीक है, जब तक आपके चयन करता नहीं * कर रहे हैं, उन लोगों के ठीक होना चाहिए। INSERT के लिए, यदि आप फ़ील्ड को GETDATE() का डिफ़ॉल्ट देते हैं और NULL को अनुमति देते हैं, तो आप इसे बाहर कर सकते हैं और यह अभी भी भर जाएगा।

1

इस पर निर्भर करता है कि आपके अन्य प्रश्न कैसे स्थापित किए गए हैं। अगर वे SELECT [Item1], [Item2], ect हैं .... तो आपको किसी भी मुद्दे का सामना नहीं करना पड़ेगा। यदि यह SELECT * FROM है तो आप कुछ अप्रत्याशित परिणामों का अनुभव कर सकते हैं।

ध्यान रखें कि आप इसे कैसे सेट अप करना चाहते हैं, आपको या तो इसे शून्य करने के लिए सेट करना होगा जो आपको सड़क से फिट बैठ सकता है, या एक डिफ़ॉल्ट तिथि निर्धारित कर सकता है, जो आपको रिपोर्टिंग के लिए गलत डेटा दे सकता है, पुनर्प्राप्ति, प्रश्न, ect ..

+0

यह निश्चित रूप से कुछ भी विचार करने के लिए है। इसे ध्यान में रखते हुए रिपोर्टिंग के लिए होगा। धन्यवाद। – frans

संबंधित मुद्दे