2009-08-13 15 views
11

मैं पिछले कुछ दिनों में विकासशील बैकएंड कर रहा हूं, और जैसा कि हम केंद्रीय डेटाबेस स्क्रिप्ट के साथ काम कर रहे हैं, मैं बस सादे पुराने SQL अपग्रेड लिखता हूं स्क्रिप्ट, और डेटाबेस में निष्पादित करें। ठीक है ठीक है और सभी, लेकिन क्यों 'रीफ्रेश व्यू' स्क्रिप्ट लिखना है, और जब भी मैं कुछ फ़ील्ड को एक दृश्य में जोड़ या संपादित करता हूं उन्हें निष्पादित करता हूं।कुछ समय में SQL सर्वर दृश्यों को हर बार रीफ्रेश करने की आवश्यकता क्यों होती है

एसक्यूएल सर्वर समझता है कि इसे प्रबंधन स्टूडियो में फैंसी व्यू-एडिट विंडो में संपादित करते समय इसे रीफ्रेश करने की आवश्यकता है, तो यह स्क्रिप्ट के माध्यम से दृश्य को संपादित करने के बाद खुद को रीफ्रेश करने के लिए क्यों नहीं कह सकता है?

उत्तर

9

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

आपको दृश्य को बदलने के लिए sp_refreshview चलाने की आवश्यकता नहीं है। केवल अपनी अंतर्निहित तालिकाओं को बदलने के लिए।

इसके अलावा, कृपया मजेदार मज़ेदार गेंद को टाटा न करें।

संपादित करें: अपनी समस्या को पुन: उत्पन्न करने के प्रयास के लिए बस इस कोड (उत्तराधिकार में) चलाया। मैं था, दुर्भाग्य से, करने में असमर्थ है, क्योंकि यह उम्मीद (एसक्यूएल सर्वर 2008) के रूप में काम:

create view MyView 
as 
select ProductKey, ProductID, ProductName, Price 
from dbo.Products 

select v.* from MyView v 

alter view MyView 
as 
select ProductKey, ProductID, ProductName, Price*100 as MyPrice 
from dbo. Products 

select v.* from MyView v 
+1

लेकिन यह व्यवहार तब भी होता है जब मेरे पास SELECT b जैसे कुछ है। * बी से। बी में कॉलम जोड़ने के बाद, दृश्य पुराने कॉलम प्रदर्शित करने का प्रयास करता है, भले ही वे हार्डकोड न हों। –

+0

एरिक की टिप्पणियां अभी भी हैं। जब भी अंतर्निहित तालिकाओं के लिए स्कीमा बदल जाता है, तब भी दृश्य के लिए मेटाडेटा को रीफ्रेश करने की आवश्यकता होती है, भले ही दृश्य के लिए कोड अन्यथा सही रहे। – TimothyAWiseman

3

उपयोग किसी भी अधिक रीफ्रेश

और ALTER देखें के साथ संयोजन में की आवश्यकता को दूर करने के लिए दृश्य परिभाषा WITH SCHEMABINDING, डिजाइनर

उपरोक्त लिंक से जुलाई 2012 संपादित करें। मेरे बोल्ड

SCHEMABINDING

अंतर्निहित तालिका या तालिकाओं की स्कीमा को देखने बांधता है। जब SCHEMABINDING निर्दिष्ट किया गया है, बेस तालिका या तालिका इस तरह से संशोधित नहीं की जा सकती है जो दृश्य परिभाषा को प्रभावित करेगी। संशोधित होने वाली तालिका पर निर्भरता को हटाने के लिए दृश्य परिभाषा को पहले संशोधित या गिरा दिया जाना चाहिए। जब आप SCHEMABINDING का उपयोग करते हैं, तो select_statement में संदर्भित तालिकाओं, विचारों, या उपयोगकर्ता परिभाषित कार्यों के दो भाग वाले नाम (schema.object) शामिल होना चाहिए। सभी संदर्भित वस्तुओं को एक ही डेटाबेस में होना चाहिए।

SCHEMABINDING क्लॉज के साथ बनाए गए दृश्य में भाग लेने वाले दृश्य या तालिका को तब तक नहीं छोड़ा जा सकता जब तक कि उस दृश्य को छोड़ दिया या बदला न जाए ताकि इसमें स्कीमा बाध्यकारी न हो। अन्यथा, डेटाबेस इंजन एक त्रुटि उठाता है। साथ ही, निष्पादित करने वाले टेबल पर वैकल्पिक तालिका विवरण जो स्कीमा बाइंडिंग वाले दृश्यों में भाग लेते हैं विफल होते हैं जब ये कथन दृश्य परिभाषा को प्रभावित करते हैं।

+3

मुझे यह सुझाव देने में हिचकिचाहट हुई। 'SCHEMABINDING' के साथ * केवल * काम करता है यदि टेबल एक ही सर्वर पर एक ही डेटाबेस में हैं। – Eric

+1

स्कीमाबाइंडिंग के साथ उपयोग किसी भी ताज़ा करने की आवश्यकता को हटा देगा क्योंकि यह अंतर्निहित तालिकाओं को बदलने से रोकता है।सबसे अच्छा यह होगा यदि आपको अंतर्निहित तालिकाओं को बदलना है, तो आपको एक अनुस्मारक दिया जाता है कि आपको बाद में दृश्य को अपडेट करने की आवश्यकता होती है क्योंकि आप परिवर्तन करने के लिए स्कीमाइंडिंग के साथ हटाते हैं। – TimothyAWiseman

+1

मुझे नहीं पता कि परिवर्तन को रोकने के लिए रीफ्रेश की आवश्यकता को दूर करने के बराबर कैसे है? जब तक मुझे गलती न हो कि SCHEMABINDING के साथ अंतर्निहित तालिकाओं को बदलने से रोका जाएगा? – ErikE

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

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