2015-02-17 3 views
5

यह सवाल मेरा एक पिछले पोस्ट/समाधान से बाहर आया:एसक्यूएल सर्वर कारण है कि मैं मेज के बाद देखा गया रीफ़्रेश करना होगा बदलता है

adding a field somehow effects a views results

IMO यह अपने आप ही पद के योग्य है। SQL सर्वर 2008 R2 का उपयोग करना।

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

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

निश्चित रूप से इसके लिए एक और दृष्टिकोण है?

+1

एक दृश्य केवल एक प्रश्न नहीं है, हर बार इसे गतिशील रूप से पुनर्गठित करने पर स्वयं को पुनर्गठित करता है। यह एक स्कीमा, कॉलम और आगे के साथ तत्काल है। कई मामले हैं (जैसे कि आपके द्वारा संदर्भित लिंक में से एक) जहां परिणाम सेट में अतिरिक्त कॉलम जोड़ना अप्रत्याशित रूप से व्यवहार कर सकता है। हालांकि इस तरह के अधिक लक्स कार्यान्वयन की विपरीत दिशा में आप जाते हैं, विचारों को भी SCHEMABINDING विकल्प के साथ घोषित किया जा सकता है, जो अंतर्निहित वस्तुओं में स्कीमा परिवर्तनों को प्रतिबंधित करता है। हालांकि, जैसा कि कई स्थानों पर देखा गया था, यदि आप एक नया कॉलम चुनने के लिए स्कीमा चाहते हैं, तो आपको अपने समय के लिए धन्यवाद sp_refreshview – Xedni

+0

का उपयोग करना होगा। हालांकि मुझे यह पसंद नहीं है, यह समझ में आता है। मुझे एहसास है कि विचारों के लिए संसाधन दक्षता लाभ है। यह कहा, मुझे पूरा यकीन है कि मैं उन्हें अब भी कम पसंद करता हूं। एक तालिका में कॉलम जोड़ने के परिणामस्वरूप मैंने आज देखा है कि अंतिम उपयोगकर्ता अनुभव uvery erratic – Mat41

+2

दृश्य हमेशा खराब नहीं होते हैं। वे जटिल प्रश्नों को सरल बनाने के लिए बहुत अच्छे हैं, जो प्रश्नों में व्यवसाय नियमों को मानकीकृत करते हैं जिन्हें ऐप्स या संग्रहीत प्रोसेस में साझा किया जा सकता है, आपको नाम बदलने वाले फ़ील्ड लिखने या तीसरे पक्ष के डेटाबेस के खिलाफ प्रश्नों को सरल बनाने में सक्षम बनाता है (विशेष रूप से पुरातन नाम वाले विरासत वाले, जैसे तालिका के रूप में एई 1401 फ़ील्ड FN144, आदि के साथ नाम), और जब ऐप्स तालिका साझा करते हैं, यदि अंतर्निहित तालिका फ़ील्ड बदलना चाहिए, तो दृश्य नाम वही बना सकता है जो आपको एकाधिक ऐप्स बदलने के लिए मजबूर नहीं कर सकता है। –

उत्तर

4

गतिशील प्रबंधन दृश्यों का उपयोग करें पहचान करने के लिए किए जाने वाले दृश्य अपनी मेज परिवर्तन से प्रभावित कर रहे थे, तो असर पड़ा विचारों के परिणामों के माध्यम से लूप गतिशील एसक्यूएल sp_refreshview (https://msdn.microsoft.com/en-us/library/ms187821(v=sql.105).aspx)

कॉल करने के लिए उपयोग करने के लिए यहां एक त्वरित स्क्रिप्ट आप अनुकूलन सकता है यदि आप चाहें तो एक संग्रहित प्रो में:

DECLARE @TableName VARCHAR(500) = 'dbo.Accounts' 

DECLARE @ViewsToUpdate TABLE (ViewName VARCHAR(500)) 
    INSERT @ViewsToUpdate 
     SELECT 
      Views.TABLE_SCHEMA + '.' + Views.TABLE_NAME 
     FROM INFORMATION_SCHEMA.TABLES [Views] 
      INNER JOIN sys.dm_sql_referencing_entities(@TableName, 'OBJECT') DependingViews 
       ON DependingViews.referencing_schema_name = Views.TABLE_SCHEMA 
        AND DependingViews.referencing_entity_name = Views.TABLE_NAME 
     WHERE [Views].TABLE_TYPE = 'View' 

WHILE EXISTS (SELECT * FROM @ViewsToUpdate) BEGIN 
    DECLARE @ViewName VARCHAR(500) = (SELECT TOP 1 ViewName FROM @ViewsToUpdate) 
    DECLARE @Sql NVARCHAR(1000) = 'EXEC sp_refreshview ''' + @ViewName + '''' 
    EXEC sys.sp_executesql @Sql 
    DELETE @ViewsToUpdate WHERE ViewName = @ViewName 
END 
+0

किसी चयनित तालिका से संबंधित ऑटो-रीफ्रेश दृश्यों के लिए कोड नमूना जोड़ा गया –

+0

आपके समय के लिए धन्यवाद। मुझे इस मुद्दे को पुन: पेश करने की मंजूरी के लिए इंतजार करना होगा और फिर इसे चलाएं/परीक्षण करें, लेकिन यह निश्चित रूप से सभी आवश्यक विचारों को साफ़ करने के लिए एक अच्छा समाधान जैसा दिखता है! – Mat41

+1

एक और विशेषता जो मैं अभी भी, जो कि उपयोगी हो सकती है, अगर यह एक टेबल थोक संदर्भ के रूप में सरल है, तो SYNONYM सुविधा है। यह, जैसा कि नाम से पता चलता है कि केवल एक टेबल के लिए उपनाम बनाता है जो सीधे आपकी क्वेरी को उस ऑब्जेक्ट के साथ भेजता है जो समानार्थी है (क्या यह एक शब्द है?)। फिर, यदि आप उस ऑब्जेक्ट में कोई कॉलम जोड़ते हैं, तो यह स्वचालित रूप से शामिल होता है क्योंकि यह मूल रूप से अंतर्निहित वस्तु है। – Xedni

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