2011-06-23 4 views
10

मुझे एक काफी पर्याप्त परियोजना मिली है, जो SQL सर्वर (2005 और 2008) दृश्यों का व्यापक उपयोग करता है।एसक्यूएल सर्वर 2008 - कुछ विचारों पर sp_refreshview बमबारी

बिल्ड प्रक्रिया में एक कदम sp_refreshviews सिस्टम संग्रहीत प्रक्रिया को कॉल करने के लिए है, यह सुनिश्चित करने के लिए कि किसी भी टेबल पर कोई भी बदलाव हमारे विचारों को तोड़ नहीं देता है। यह ठीक काम करता है .... के बारे में तीन या चार बार देखा गया (200 में से) के अलावा ....

उन के साथ

, यह सिर्फ बम बाहर -

की तरह अजीब त्रुटि संदेश देता है संदेश 15,165, स्तर 16, राज्य 1, प्रक्रिया sp_refreshsqlmodule_internal, रेखा 55
नहीं मिल सका वस्तु 'vYourViewNameHere' या आपके पास अनुमति नहीं है।

जो मृत गलत है - उस दृश्य मौजूद नहीं है, और मैं निश्चित रूप से इसे से चुन सकते हैं।

मुझे के बारे में कोई अच्छी संक्षिप्त जानकारी नहीं मिल रही है क्यों ऐसा होता है, यह क्या ट्रिगर करता है ... कोई विचार? क्या ऐसे समस्याग्रस्त विचारों का पता लगाने के लिए मैं कुछ कर सकता हूं? क्या मैं अपनी definitino बदल सकता हूँ ताकि वे फिर से ताज़ा किया जा सके?

अद्यतन: मैंने इसके लिए माइक्रोसॉफ्ट कनेक्ट पर एक बग रिपोर्ट लॉग की - यदि आप सहमत हैं कि यह अजीब लगता है और इसे ठीक करने की आवश्यकता है, तो कृपया इसके लिए वोट दें!

https://connect.microsoft.com/SQLServer/feedback/details/676728/sp-refreshview-crashes-with-misleading-error-on-views-with-schemabinding

+0

इस [कनेक्ट आइटम] (http://connectppe.microsoft.com/SQLServer/feedback/details/669621/sp-refreshview-fails-for-views-that-were-created-without-explicitly है -क्वल्पिफाइंग-उनकी-स्कीमा-नाम) आपकी स्थिति के लिए प्रासंगिक है? –

+0

@ जो स्टीफनेल्ली: इसे आजमाया - एक ही परिणाम :-(मैंने उन समस्याओं में से एक को छोड़ दिया, और इसे स्पष्ट स्कीमा के साथ फिर से बनाया - अभी भी ताज़ा नहीं होना चाहिए .... –

+0

sp_refreshview को बदलने की अनुमति की आवश्यकता है प्रश्न में देखें। आपने उल्लेख किया है कि आप इसका चयन कर सकते हैं, लेकिन क्या आप उसी दृश्य के साथ व्यक्तिगत दृश्य को संशोधित कर सकते हैं, जिसके तहत आप sp_refreshview चला रहे हैं? – RThomas

उत्तर

13

मैं टिप्पणी में देखा आप इसे SCHEMABINDING है का उल्लेख है। मैं लगभग गारंटी दे सकता हूं कि यह मुद्दा है। Books online विशेष रूप से कहता है कि यह गैर स्कीमा बाध्य विचारों पर उपयोग के लिए है।

एक योजनाबद्ध दृश्य ब्रेकिंग परिवर्तन होने की अनुमति नहीं देगा ताकि मेटा-डेटा अपडेट करना आवश्यक न हो। आप इसे सुरक्षित रूप से छोड़ सकते हैं।

आप इस तरह सभी schemabound दृश्यों की पहचान कर सकते हैं:

SELECT * FROM sys.views WHERE OBJECTPROPERTY(object_id, 'IsSchemaBound')=1 
+0

हां यह है ..... मैं हमेशा इस छाप के नीचे था कि इसने किसी भी को रोक दिया अंतर्निहित तालिकाओं को बदलने से - कभी कल्पना नहीं की गई है कि यह उन विचारों पर विफल होने के लिए 'sp_refreshview' सिस्टम स्पोक का कारण बन जाएगा ..... –

+1

मुझे आश्चर्य है कि यह एक त्रुटि को फेंक देता है। आपको लगता है कि यह केवल इसे अनदेखा कर देगा। – RThomas

+0

हां, वास्तव में ... केवल उन विचारों को छोड़ दें जिनके पास रीफ्रेश पर 'स्मेमाइंडिंग' है, क्योंकि वे स्वयं पहले ही सुनिश्चित कर चुके हैं कि कुछ भी नहीं बदला है .... साथ ही त्रुटि संदेश वास्तव में q है यूट क्रिप्टिक और भ्रामक, भी .... –

0

इस त्रुटि के मेरे अवतार था:

संदेश 8116, स्तर 16, राज्य 1, प्रक्रिया sp_refreshsqlmodule_internal, लाइन 75 तर्क फ़ंक्शन को प्रतिस्थापित करने के तर्क 1 के लिए डेटा प्रकार int अमान्य है।

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

मैंने अपनी स्क्रिप्ट में एक वर्कअराउंड के रूप में निम्न कॉल पर टिप्पणी की, और स्क्रिप्ट सफलतापूर्वक पूर्ण हो जाएगी।

-- EXECUTE sp_refreshview @viewName;

नोट: मेरे डेटाबेस होने एक schemabound बार देखा गया जब क्वेरी चलाने की रिपोर्ट नहीं की थी RThomas 'आसन्न जवाब में सुझाव दिया https://stackoverflow.com/a/6460532/179972

अद्यतन - समाधान:

के बाद हमारे डेटाबेस स्क्रिप्ट sp_refreshview कमांड के साथ सफलतापूर्वक भाग गया (ऊपर दिखाया गया), फिर हमने दृश्य को रीफ्रेश कोड चलाया, और यह भी सफल रहा।

-
इस उत्तर यह कैसे सफलतापूर्वक काम कर रहा था के रूप में मेरे लिए कोई मतलब नहीं है, फिर भी मैं इसे यहाँ मामले में दस्तावेजीकरण किया है यह किसी और के लिए उपयोगी साबित होता है।

4

sp_helptext का उपयोग करते समय मैं एक ही त्रुटि में भाग गया। मेरे मामले में कारण दृश्य का नाम बदलने के लिए sp_rename का उपयोग कर रहा था। निम्न कोड इस त्रुटि को पुन: उत्पन्न करता है।

create view demo as select dummy = 1 
go 

exec sp_rename 'demo', 'new_demo' 
go 

exec sp_refreshview 'new_demo' 
go 

एकमात्र समाधान मैन्युअल रूप से दृश्य को बदलने का है। इसके बाद के संस्करण समाधान के लिए यह सुधार लागू करें और आप पाते हैं:

create view demo as select dummy = 1 
go 

exec sp_rename 'demo', 'new_demo' 
go 

-- This statement fixes the problem 
alter view new_demo as select dummy = 1 
go 

exec sp_refreshview 'new_demo' 
go 
0

जो दृश्य है आपकी समस्या को सामान्य sppRefreshViews करने के लिए एक प्रिंट जोड़ने को खोजने के लिए। पृथ्वी पर कुछ भी नहीं टूट रहा, लेकिन मैंने सोचा कि मैं साझा करूंगा।

CREATE procedure sppRefreshViews2 

    as 
    declare @t varchar (1024) 

    declare tbl_cur cursor for 
    select TABLE_NAME from INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'VIEW' and table_name like 'sp%' 
    OPEN tbl_cur 

    FETCH NEXT from tbl_cur INTO @t 
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
    print  @t 
    exec ('sp_refreshview ''' + @t + '''') 
    FETCH NEXT from tbl_cur INTO @t 
    END 

    CLOSE tbl_cur 
    DEALLOCATE tbl_Cur 
संबंधित मुद्दे