2010-08-19 20 views
5

मुझे एक टूटी हुई एप्लिकेशन से संबंधित टिकट मिला जो टूटी हुई संग्रहीत प्रक्रिया के कारण हुआ था।सहेजे गए टूटे हुए संसाधित

संग्रहीत प्रक्रिया कुछ महीनों के लिए काम कर रही थी, लेकिन आज जब मैंने इसकी जांच की तो मुझे कुछ कीड़े मिलीं।

पहले इस तरह की एक क्वेरी थी।

table1 एक में शामिल हों table2 ख से a.a का चयन करें, b.b, a.b। A.a = b.a

"ON" के बाद की अवधि स्पष्ट रूप से त्रुटि उत्पन्न हुई। इसे ठीक करना आसान था, लेकिन जहां तक ​​मुझे पता है, आप टूटी हुई प्रक्रिया को सहेज नहीं सकते हैं। असल में, जब मैंने संग्रहित प्रक्रिया खोला, (इसे संशोधित किए बिना) और वहां से कोड के साथ परिवर्तन चलाने की कोशिश की, यह त्रुटि संदेशों के साथ विफल रहा।

संग्रहीत प्रक्रिया के माध्यम से इस तरह की अन्य त्रुटियां थीं जिन्हें मैंने अंततः बदलने के लिए तय किया था।

मुझे समझ में नहीं आता कि यह कैसे संभव है, और यह जानना चाहेंगे कि टूटा हुआ संग्रहित प्रक्रिया क्या बदल सकती है और सहेज सकती है। जो मुझे बताया गया है उससे सर्वर में कोई बदलाव नहीं आया है, और जैसा कि मैंने पहले बताया था कि इस संग्रहीत प्रक्रिया पिछले कुछ महीनों से काम कर रही है

ऐसा लगता है जैसे मैं एक भूत शिकार कर रहा हूं, और किसी भी सूचना के लिए बहुत आभार होगा।

+1

sys.procedures से चयन नाम, create_date, modified_date, * चलाएं और पता लगाएं कि डीबी पर प्रक्रिया कब बनाई गई थी। जांचें कि यह नहीं बदला गया था। –

उत्तर

7

मुझे लगता है कि यह स्थगित नाम समाधान का मुद्दा है।

SQL सर्वर आपको उन प्रक्रियाओं को बनाने की अनुमति देगा जो संग्रहीत प्रक्रिया निर्माण के समय मौजूद वस्तुओं का संदर्भ नहीं देते हैं। इस मामले में, एसक्यूएल क्वेरी के संकलन को रनटाइम में स्थगित करने का विकल्प चुनता है, इस बात पर भरोसा है कि ऑब्जेक्ट प्रक्रिया के समय तक होगा, इसलिए जब प्रक्रिया बनाई जाती है तो सिंटैक्स सत्यापित नहीं होता है।
यदि प्रक्रिया को बाद में निष्पादित किया जाता है तो वाक्यविन्यास गलत है, तो आपको उस बिंदु पर एक त्रुटि मिलेगी, लेकिन प्रक्रिया निर्माण के दौरान नहीं।

उदाहरण के लिए, यदि table1 और table2 मौजूद नहीं है, इस बयान त्रुटि के बिना पूरा हो जाएगा:

CREATE PROCEDURE testproc AS 
SELECT a.a 
     , b.b 
     , a.b 
FROM table1 a 
     JOIN table2 b ON. a.a = b.a 

जब आप testproc निष्पादित करने के लिए जाना, आपको निम्न त्रुटि मिल जाएगा: "बहु-भाग पहचानकर्ता ".aa" बाध्य नहीं किया जा सका। "

+0

+1। मैंने कभी यह नहीं देखा है। दिन अभी भी जवान है और मैंने पहले ही कुछ सीखा है। –

+0

कुछ दिनों बाद मैं वास्तव में इस स्थिति की घटना में भाग गया, जहां "मैंने" एक अस्थायी प्रक्रिया के साथ एक संग्रहित प्रक्रिया बनाई। हालांकि मुझे अभी भी यह पता नहीं लगाया गया है कि संग्रहीत प्रक्रिया कैसे बदल गई/चेतावनी के साथ टूट गई, मैंने अब कुछ बैक अप बनाए हैं और मुझे उम्मीद है कि यह फिर से नहीं होगा। –

+0

तो, "यह कैसे हुआ?" के संबंध में सवाल, क्या आपने बिल्टिन रिपोर्ट की कोशिश की है? SQL 2K5 और 2K8 में पृष्ठभूमि में एक डिफ़ॉल्ट ट्रेस चल रहा है जो सर्वर पर सभी ऑब्जेक्ट परिवर्तनों को कैप्चर करता है। सर्वर या डेटाबेस स्तर पर स्कीमा चेंज हिस्ट्री रिपोर्ट के माध्यम से परिवर्तन दिखाई दे रहे हैं। प्रश्न में डेटाबेस पर बस राइट-क्लिक करें, रिपोर्ट्स -> मानक रिपोर्ट -> स्कीमा चेंज हिस्ट्री चुनें।उपलब्ध इतिहास की मात्रा इस बात पर निर्भर करेगी कि कितनी गतिविधि हुई है, लेकिन SQL सर्वर 5 ट्रेस फ़ाइलों को ऑनलाइन रखता है। वे 20 एमबी या सर्वर पुनरारंभ करते हैं, जो भी पहले आता है। –

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