SQL सर्वर तालिका का नाम उपयोगकर्ता डेटाबेस में # के साथ शुरू हो रहा है, tempdb में नहीं, अस्थायी तालिका में नहीं


13

किसी तरह, दशकों पहले, हमारे डेटाबेस में एक तालिका बनाई गई जो एक के साथ शुरू होती है #। यह ऐप के डेटाबेस के अंतर्गत ऑब्जेक्ट एक्सप्लोरर में दिखाई देता है, अंदर नहीं tempdb। किसी कारण से, Azure इस तरह डेटाबेस आयात नहीं करेगा।

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

हम SQL 2008 R2 पर हैं।

drop table [*app*].[dbo]."#OBSOLETE";

Database name '*app*' ignored, referencing object in tempdb.
Msg 3701, Level 11, State 5, Line 1
Cannot drop the table '#OBSOLETE', because it does not exist or you do not 
have permission.

exec sp_rename "dbo.#OBSOLETE", "dbo.obsolete"

Msg 15225, Level 11, State 1, Procedure sp_rename, Line 338
No item by the name of 'dbo.#OBSOLETE' could be found in the current database '*app*', given that @itemtype was input as '(null)'.

हम इस वस्तु को कैसे मारते हैं ताकि हम इसे Azure में स्थानांतरित कर सकें?


4
तालिका नाम के आसपास कोष्ठक लगाने की कोशिश करें, वही प्रतिक्रिया?
rvsc48

1
अगर @ rvsc48 का समाधान यह नहीं करता है, तो क्या आप QUOTENAME फ़ंक्शन का उपयोग करने का प्रयास कर सकते हैं (हालांकि मुझे लगता है कि यह होगा)। docs.microsoft.com/en-us/sql/t-sql/functions/…
MguerraTorres

1
ब्रैकेट: एक ही प्रतिक्रिया।
कि वह

1
कृपया इस तालिका वाले DB में निम्नलिखित क्वेरी चलाएँ और आउटपुट को प्रश्न में चिपकाएँ SELECT [name], CONVERT(VARBINARY(128), [name]) FROM sys.tables WHERE [name] = N'#OBSOLETE';:। धन्यवाद।
सोलोमन रटज़की

2
एक अन्य विकल्प (कि मेरे पास परीक्षण करने का समय नहीं है): 1)object_id उस तालिका का विवरण प्राप्त करें । 2) एकल-उपयोगकर्ता मोड में उदाहरण को पुनरारंभ करें। 3) समर्पित व्यवस्थापक कनेक्शन के माध्यम से कनेक्ट करें। 4) उस DB में, कुछ इस तरह का प्रयास करें UPDATE sys.objects$ SET [name] =N'obsolete' WHERE [object_id] = {ye_olde_object_id}; {enter} GO {enter}। एक शॉट के लायक ..
सोलोमन रटज़की

जवाबों:


16

दिया हुआ:

  1. sp_rename ऑब्जेक्ट आईडी के बजाय ऑब्जेक्ट नामों का उपयोग करता है,
  2. हम ऑब्जेक्ट नाम का उपयोग नहीं कर सकते क्योंकि यह एक के साथ शुरू होता है #और इसकी व्याख्या विशेष अर्थ के रूप में की जाती है और इसे अलग तरीके से संभाला जाता है,
  3. अन्य सभी विकल्प समाप्त हो गए हैं

आपको अंतर्निहित सिस्टम कैटलॉग तालिका को सीधे समर्पित व्यवस्थापक कंसोल (DAC) कनेक्शन के माध्यम से संपादित करने का प्रयास करना चाहिए :

  1. object_idउस तालिका को प्राप्त करें ।
  2. उदाहरण को एकल-उपयोगकर्ता मोड में पुनरारंभ करें। यह सिस्टम टेबलों को सीधे अपडेट करने में सक्षम है (यानी डीएसी कनेक्शन का उपयोग करने की आवश्यकता नहीं है)।
  3. समर्पित व्यवस्थापक कंसोल कनेक्शन के माध्यम से कनेक्ट करें। आप कमांड प्रॉम्प्ट विंडो में निम्न चलाकर SQLCMD इंटरेक्टिव सत्र में यह कर सकते हैं:

    C:\> SQLCMD -A -E

    या, का उपयोग कर सीधे DB से कनेक्ट करें:

    C:\> SQLCMD -A -E -d {database_name}
  4. उस DB में, निम्न की तरह कुछ प्रयास करें:

    UPDATE sys.objects$ {enter}
    SET [name] = N'obsolete' {enter}
    WHERE [object_id] = {ye_olde_object_id}; {enter}
    GO {enter}

    जब तक आप अंदर नहीं डालेंगे तब तक यह कथन पर अमल नहीं करेगा GO {enter}

कृपया सिस्टम कैटलॉग टेबल को सीधे संपादित करते समय सतर्क रहें, और इसे करने के विचार के साथ बहुत सहज न हों। यह कुछ ऐसा है जो केवल तभी किया जाना चाहिए जब समस्या को ठीक करने का कोई दूसरा तरीका न हो (जैसे कि यहां मामला)। प्रत्यक्ष संपादन करने से बचने के लिए संभवतः कई कारण हैं, लेकिन शुरू में ध्यान में आने वाले दो हैं:

  • हमारे द्वारा बनाए जाने वाले डेटा-मॉडल बहुत पसंद करते हैं, इस बात की संभावना के नियम और वर्कफ़्लोज़ हैं कि हम किस तरह से काम करते हैं, जिससे हम अनभिज्ञ हैं (उदाहरण के लिए, "व्यापार" विभिन्न तालिकाओं में डेटा की स्थिति को नियंत्रित करने वाले नियम आदि)
  • यदि आप समस्याओं में भाग लेते हैं और समर्थन अनुबंध करते हैं (तो मैंने समर्थन अनुबंध की शर्तें नहीं देखी हैं), लेकिन मुझे इस बात पर विश्वास करने में कठिन समय है कि ऐसी भाषा में नहीं होगा वहाँ)

    @Paul रान्डल ने मेरे संबंधित उत्तर पर एक टिप्पणी में पुष्टि की: "मैन्युअल रूप से एक सिस्टम टेबल को संपादित करना डेटाबेस के बूट पेज में एक ध्वज सेट करता है जो आपके डेटाबेस को इस तरह से संपादित किए जाने के रूप में चिह्नित करता है, और सीएसएस मदद नहीं करने का फैसला कर सकता है यदि आप बाद में उस डेटाबेस के साथ समस्या रखते हैं। "


4
मुझे उत्तर पसंद है, लेकिन शायद यह एक वाक्य जोड़ने के लायक है क्योंकि ऐसा करना इतना खतरनाक क्यों है?
जो ओब्‍बिश

@JoeObbish धन्यवाद, और अच्छा सुझाव। मैं कल कुछ जोड़ने की कोशिश करूंगा।
सुलैमान रटज़की

2
@JoeObbish मैंने अभी कुछ जोड़ा है। क्या यह पर्याप्त है?
सोलोमन रटज़की
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.