2009-09-03 7 views
18

में संग्रहीत प्रक्रिया का नाम बदलें मैं SQL Server 2008 में sp_rename system sproc के साथ संग्रहीत प्रक्रिया का नाम बदलने का प्रयास कर रहा हूं। तीसरे पैरामीटर मुझे कठिनाई हालांकि दे रहा है और मैं निम्नलिखित त्रुटि प्राप्त रखना: संदेश इंगित करता हैSQL सर्वर

Msg 15249, Level 11, State 1, Procedure sp_rename, Line 75 
Error: Explicit @objtype 'P' is unrecognized. 

जैसा कि मैंने पैरामीटर का मान के लिए एक पी में गुजर रहा हूँ। मैं इस तरह sproc फोन:

EXEC sp_rename @objName = @procName, @newname = @WrappedName, @objtype = 'P'; 

मैं डबल प्रलेखन जो कहते हैं इस sys.objects से मूल्य है की जाँच की। मैं दोहरी जांच करने के लिए निम्न मैं नहीं जा रहा था भाग गया पागल

select * from sys.objects where name = 'MySprocName' 

और वास्तव में प्रकार लौटे पी

है

क्या किसी को पता है कि मैं यहाँ क्या पारित करना चाहिए? मैं इसे खाली नहीं छोड़ना चाहता क्योंकि मैं अन्य चीजों के बीच एक सामान्य स्पोक बना रहा हूं, मनमानी स्पॉक्स का नाम बदलता हूं और यदि किसी स्पोक के बीच नाम टकराव होता है और कुछ और मैं इसके बारे में चिंता नहीं करना चाहता हूं।

उत्तर

17

docs के अनुसार, 'पी' एक सही विकल्प नहीं है। आपको 'ऑब्जेक्ट' का प्रयास करना चाहिए जैसा कि आप जो करने की कोशिश कर रहे हैं उसके सबसे नज़दीकी चीज की तरह दिखते हैं। लेकिन, आप इस चेतावनी पर ध्यान देना चाहिए ...

Changing any part of an object name can break scripts and stored procedures. We recommend you do not use this statement to rename stored procedures, triggers, user-defined functions, or views; instead, drop the object and re-create it with the new name.

इसके अलावा (समान MSDN पेज से):

Renaming a stored procedure, function, view, or trigger will not change the name of the corresponding object name in the definition column of the sys.sql_modules catalog view. Therefore, we recommend that sp_rename not be used to rename these object types. Instead, drop and re-create the object with its new name.

+0

धन्यवाद, मैंने पढ़ा है लेकिन किसी भी तरह से मुझे उचित मूल्य को याद करने की आवश्यकता है। –

+0

ध्यान दें कि प्रक्रिया छोड़ने से सभी संबंधित अनुमतियां गिर जाएंगी। नाम बदलने का सबसे अच्छा तरीका sp_rename का उपयोग करना है और फिर sys_modules को सही करने के लिए proc को बदलना है। – Boogier

36

बस @objtype पैरामीटर छोड़ देते हैं (डिफ़ॉल्ट रिक्त है) और यह काम करेंगे।

EXEC sp_rename 'sp_MyProc', 'sp_MyProcName' 

आप निम्न चेतावनी प्राप्त होगा, लेकिन प्रक्रिया में बदल दिया जाएगा

Caution: Changing any part of an object name could break scripts and stored procedures.

की तरह दूसरों को कहा गया है, आप ड्रॉप और प्रक्रिया को पुन: चाहिए।

0

एसक्यूएल 2000 दिनों में, यह ड्रॉप/क्रिएट के लिए सुरक्षित था - एसक्यूएल sp_rename का उपयोग करते समय प्रो के लिए मेटा डेटा को सिंच से बाहर करने के लिए उपयोग किया जाता था।

फैंसी डीडीएल को कैसे करना है इसका पता लगाने का सबसे अच्छा तरीका एसएसएमएस का उपयोग ऑब्जेक्ट का नाम बदलने के लिए करना है जबकि प्रोफाइलर ट्रेस संलग्न है।

2

sp_rename प्रक्रियाओं का समर्थन नहीं करता:

Changes the name of a user-created object in the current database. This object can be a table, index, column, alias data type, or Microsoft .NET Framework common language runtime (CLR) user-defined type.

बस एक ही शरीर और नए नाम के साथ नई प्रक्रिया बनाने के लिए, तो पुराने एक ड्रॉप।

+1

यह सही नहीं है। sp_rename ने 'ओब्जेक्ट' को @objtype के रूप में निर्दिष्ट करके काम किया। –

+5

@ पीटर: यह 100% सटीक नहीं हो सकता है, लेकिन sp_rename का उपयोग निश्चित रूप से अनुशंसित नहीं है। _ "संग्रहीत प्रक्रिया, फ़ंक्शन, व्यू, या ट्रिगर का नामकरण sys.sql_modules कैटलॉग व्यू के परिभाषा कॉलम में संबंधित ऑब्जेक्ट नाम का नाम नहीं बदलेगा। इसलिए, हम अनुशंसा करते हैं कि sp_rename इन ऑब्जेक्ट प्रकारों का नाम बदलने के लिए उपयोग नहीं किया जाए। इसके बजाए, ऑब्जेक्ट को अपने नए नाम से ड्रॉप और फिर से बनाएं। "_ ([एमएसडीएन] से (http://msdn.microsoft.com/en-us/library/ms188351.aspx)) –

1

मुझे @objtype चर के बारे में निश्चित नहीं है, हालांकि मुझे पता है कि sp_rename के माध्यम से नामकरण खराब है।

जब आप एक संग्रहित प्रो बनाते हैं, तो इसके लिए एक रिकॉर्ड sys.objects में मौजूद होता है और संग्रहीत प्रो की परिभाषा sys.sql_modules में संग्रहीत की जाएगी।

sp_rename का उपयोग केवल sys.objects में नाम बदल देगा, sys.sql_modules में नहीं, इस प्रकार आपकी परिभाषा गलत होगी।

सबसे अच्छा समाधान एक बूंद & पुन:

+0

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

0

sp_rename केवल डेटाबेस में उपयोगकर्ता बनाया वस्तुओं का नाम बदलने के लिए है। संग्रहीत प्रक्रिया का नाम बदलने से sys.sql_modules कैटलॉग व्यू के परिभाषा कॉलम में संबंधित ऑब्जेक्ट नाम का नाम नहीं बदलेगा।

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

किसी ऑब्जेक्ट नाम के किसी भी हिस्से को बदलना स्क्रिप्ट और संग्रहीत प्रक्रियाओं को तोड़ सकता है।

अधिक जानकारी के लिए आप देख सकते हैं।

http://onlyforcoder.blogspot.in/2017/11/sprename-where-to-use-where-not-to-use.html http://blog.sqlauthority.com/2008/08/26/sql-server-how-to-rename-a-column-name-or-table-name/

0

वैलेंटिनो Vranken कहा सब सच है। हालांकि ध्यान रखें कि जब आप एक संग्रहित प्रक्रिया को छोड़ते हैं और बनाते हैं, तो आप अपने सभी मेटाडेटा को खो देते हैं। (Create_Date, Modify_Date आदि)

Renaming a stored procedure, function, view, or trigger will not change the name of the corresponding object name in the definition column of the sys.sql_modules catalog view. Therefore, we recommend that sp_rename not be used to rename these object types. Instead, drop and re-create the object with its new name.

यह भी सच है। हालांकि मुझे पता चला कि जब आप नाम बदलने के बाद बदलते स्क्रिप्ट को चलाते हैं, तो यह मॉड्यूल में परिभाषा में नाम को सुधारता है।

मैंने सोचा है कि एसएसएमएस इंटरफ़ेस टी-एसक्यूएल का उपयोग किए बिना यह सब स्वचालित रूप से कैसे करता है। (शायद यह इंटरफ़ेस का उपयोग करते हुए एक एसपी का नाम बदलने पर हर बार एक स्क्रिप्ट स्क्रिप्ट चलाता है? मुझे नहीं पता।) यह दिलचस्प होगा कि एमएस एसएसएमएस नाम बदलने पर दृश्यों के पीछे क्या हो रहा है।