SQL सर्वर समानार्थक शब्द प्रकट होने से पहले, हर कोई अपने डेटाबेस अनुभव को सरल और बेहतर बनाना चाहता था।
कल्पना कीजिए कि आपके पास एक डेटाबेस के साथ एक एप्लिकेशन है जो उसी सर्वर से दूसरे डेटाबेस को संदर्भित करता है। फिर, एक प्रमुख पुनर्गठन आपकी टीम को दूसरे डेटाबेस को दूसरे सर्वर पर स्थानांतरित करने के लिए मजबूर करता है।
इसमें कोई शक नहीं कि आपका आवेदन टूट जाएगा। लेकिन उस मामले में आप क्या करेंगे? नए सर्वर को इंगित करने के लिए 2 सर्वरों को लिंक करें और सभी संदर्भों (फिर से) को हार्डकोड करें?
यदि आप चाहें तो ऐसा कर सकते हैं और भूल सकते हैं यदि आपके पास इसके कुछ या एक दर्जन संदर्भ हैं। लेकिन अगर कोई अन्य स्थानांतरण या नाम बदला जाता है, तो आपको वही दुःस्वप्न दोहराना होगा।
बहरहाल, इससे निपटने का एक बेहतर तरीका है।
एसक्यूएल सर्वर पर्यायवाची का परिचय
इससे पहले कि हम यह समझें कि आप SQL सर्वर समानार्थी शब्द के साथ क्या कर सकते हैं, आइए बताते हैं कि वे क्या हैं।
किसी भी बोली जाने वाली और लिखित भाषा में एक समानार्थी शब्द या वाक्यांश को संदर्भित करता है जिसका अर्थ दूसरे शब्द या वाक्यांश के समान होता है। तो, शब्द भव्य सुंदर . का पर्याय है और आकर्षक ।
शब्दों और वाक्यांशों के पर्यायवाची शब्दों के बारे में हम जो जानते हैं, उसके समान, SQL सर्वर पर्यायवाची स्थानीय या दूरस्थ सर्वर में रहने वाले डेटाबेस ऑब्जेक्ट के वैकल्पिक नाम को संदर्भित करता है। यहां और पढ़ें।
जैसा कि आप निम्नलिखित तथ्यों में देखेंगे, SQL सर्वर समानार्थी शब्द आपके एप्लिकेशन रखरखाव को बहुत आसान बना सकते हैं।
तो, चलिए शुरू करते हैं!
<एच2>1. SQL सर्वर समानार्थक शब्द आपके कार्य को सरल बना सकते हैं जब बेस ऑब्जेक्ट को स्थानांतरित या नाम बदला जाता हैसबसे पहले, जब किसी डेटाबेस को किसी अन्य सर्वर पर ले जाया जाता है या किसी भी कारण से उसका नाम बदला जाता है, तो वे आपको कोड परिवर्तन की परेशानी से बचाएंगे। आइए उस परिदृश्य को देखें जिसका हमने इस पोस्ट के उद्घाटन में उल्लेख किया था।
एक प्रमुख पुनर्गठन आपकी टीम को mydatabase2 . में सभी वस्तुओं के संदर्भ को बदलने के लिए बाध्य करता है prodserver2.mydatabase2. . में
तो, आप sys.sql_modules को क्वेरी करें mydatabase2 . की सभी घटनाओं के साथ mydatabase1 . से ।
USE mydatabase1
GO
SELECT
b.name
,a.definition
,b.type_desc
FROM sys.sql_modules a
INNER JOIN sys.all_objects b on a.object_id = b.object_id
WHERE a.definition like '%mydatabase2%'
GO
अब, उपरोक्त स्क्रिप्ट का आउटपुट mydatabase2 . के संदर्भ वाले सभी ऑब्जेक्ट्स को सूचीबद्ध करेगा . अच्छा, हुह? और यह उस कार्य के दायरे को परिभाषित करने में मदद करेगा जिसे किया जाना चाहिए।
लेकिन यह अभी शुरुआत है। आपको यह भी जांचना होगा कि क्या आपके क्लाइंट ऐप में कोड है या कोई अन्य कोड है जो आपके डेटाबेस के बाहर उसी का संदर्भ देता है।
प्रभावित होने वाले कोड की मात्रा दर्शाती है कि आपका नया मुद्दा कितना बड़ा है।
अब, उस स्क्रिप्ट में क्या हो रहा है, इसके बारे में कुछ और जानकारी यहां दी गई है:
- sys.sql_modules SQL ऑब्जेक्ट शामिल करें जो SQL-परिभाषित मॉड्यूल हैं जैसे कि दृश्य, संग्रहीत कार्यविधियाँ, फ़ंक्शन, आदि।
- नाम कॉलम वह जगह है जहां ऑब्जेक्ट का नाम है।
- ऑब्जेक्ट के लिए SQL कोड परिभाषा . में है sys.sql_modules . का स्तंभ ।
- sys.all_objects अपने डेटाबेस में सभी ऑब्जेक्ट जैसे टेबल, व्यू आदि शामिल करें।
- हमने type_desc लिया कॉलम यह निर्धारित करने के लिए कि यह किस प्रकार की वस्तु है (देखें, संग्रहीत कार्यविधि, आदि)
- कहां क्लॉज किसी भी SQL कोड के लिए क्वेरी को फ़िल्टर करता है जिसमें mydatabase2 . का संदर्भ शामिल है ।
- उपरोक्त स्क्रिप्ट का उपयोग करके संतोषजनक परिणाम प्राप्त करने के लिए, आपके पास सभी वस्तुओं के लिए अनुमति होनी चाहिए। इसके लिए अपने डेटाबेस एडमिनिस्ट्रेटर या समान भूमिका वाले किसी व्यक्ति से संपर्क करें। आप इसे भी देख सकते हैं।
अब जब आप जानते हैं कि अपने कार्य का दायरा कैसे प्राप्त किया जाए, तो इसे ठीक करने का समय आ गया है।
कोड की इस गड़बड़ी को कैसे ठीक करें ताकि यह दोबारा न हो
ठीक है। मुझे एक स्वीकारोक्ति करनी है।
SQL सर्वर समानार्थी शब्द का उपयोग करने से आपकी समस्याएं कम से कम ही कम होंगी, लेकिन उन्हें समाप्त नहीं करेंगी।
अब जब यह रास्ते से बाहर हो गया है, तो यह अच्छी खबर है:यदि आपके पास समानार्थी शब्द का उपयोग करने से पहले किसी दूरस्थ वस्तु के 10 संदर्भ हैं, तो आप सभी 10 को संशोधित करते हैं। लेकिन एक बार जब आप उस दूरस्थ वस्तु के पर्यायवाची का उपयोग करना शुरू कर देते हैं, तो 10 घटनाओं को संशोधित करने के बजाय, आप केवल 1 बदलते हैं। और कुछ नहीं।
अब, समानार्थी शब्दों का उपयोग करके इसे ठीक करने के चरण यहां दिए गए हैं:
- प्रत्येक दूरस्थ वस्तु के लिए एक समानार्थी शब्द बनाएँ। तो इसके बजाय prodserver2.mydatabase2.schema1.object1 आप समानार्थी शब्द का उपयोग करके इसका उल्लेख कर सकते हैं।
- प्रत्येक वस्तु के संदर्भ को उसके पर्यायवाची में संशोधित करें।
बाद में, आपको यह पता चलेगा कि इसे कैसे करना है।
द टेकअवे:
पर्यायवाची आपके कोड के किसी भी हिस्से से आधार वस्तुओं के संदर्भों की सुरक्षा के लिए अमूर्तता की एक परत प्रदान करते हैं, चाहे आपके डेटाबेस के अंदर, क्लाइंट ऐप या कहीं और। इसलिए, जब कोई अन्य परिवर्तन होता है, तो आप आनंदित हो सकते हैं, चाहे वह वस्तु स्थानांतरण हो या नाम बदलना।
2. आप अधिकांश ऑब्जेक्ट के लिए SQL सर्वर समानार्थी शब्द बना सकते हैं
इसके बाद, आइए जानें कि किन वस्तुओं के पर्यायवाची शब्द हो सकते हैं?
- टेबल्स
- दृश्य
- संग्रहीत प्रक्रियाएं
- कार्य
अब जब आप वस्तु के प्रकारों को जानते हैं, तो आपको इस बात का अंदाजा हो सकता है कि आप समानार्थक शब्द के साथ क्या कर सकते हैं। आइए अधिक विशिष्ट जानकारी प्राप्त करें।
3. आप वस्तु पर्यायवाची के लिए उपयुक्त आदेश जारी कर सकते हैं
तीसरा, यहां प्रत्येक ऑब्जेक्ट प्रकार के लिए कुछ विशिष्ट आदेश दिए गए हैं।
टेबल्स
किसी तालिका में आप जितना SELECT, INSERT, UPDATE, और DELETE कर सकते हैं, उतना ही आप इसके पर्यायवाची के लिए भी कर सकते हैं।
तो, इसके बजाय:
SELECT * FROM prodserver2.mydatabase2.schema1.table1
आपके पास एक छोटा संस्करण हो सकता है जो अगले परिवर्तन के लिए प्रतिरोधी होगा:
SELECT * FROM synonym1
चूंकि यह मामला है, आप यह भी कर सकते हैं:
UPDATE synonym1
SET column1 = <value>
और वही INSERT और DELETE के लिए जाता है।
हालांकि, कृपया निम्नलिखित के बारे में जागरूक रहें:
- एक समानार्थी के माध्यम से एक नया रिकॉर्ड डालने से आधार तालिका में एक नया रिकॉर्ड जुड़ जाएगा। हमारे मामले में, prodserver2.mydatabase2.schema1.table1 ।
- अपडेट करने और हटाने का समान प्रभाव होगा।
अभी तक, हमने केवल DML कमांड्स दिखाए हैं। DDL कमांड जैसे DROP के बारे में क्या?
दुर्भाग्य से, आप उनका प्रदर्शन नहीं कर सकते। यहां इसकी वजह बताई गई है:
समानार्थी शब्द छोड़ने से आधार तालिका नहीं गिरेगी। यह समानार्थी को छोड़ देगा। मैं इसके बारे में एक पल में विस्तार से बताऊंगा।
लेकिन यहां एक और चीज है जो आप टेबल के SQL सर्वर पर्यायवाची के लिए कर सकते हैं:जॉइन।
यह कितना सुविधाजनक हो सकता है? इसे जारी करने के बजाय:
SELECT
a.column1
,b.column1
FROM table3 a
INNER JOIN synonym1 b on a.id = b.id
आप यह कर सकते हैं:
SELECT
a.column1
,b.column1
FROM table3 a
INNER JOIN synonym1 b on a.id = b.id
क्या यह कोई आसान है? ज़रूर!
संग्रहीत प्रक्रियाएं
एक प्रासंगिक आदेश जिसे आप संग्रहीत कार्यविधि के पर्यायवाची के साथ कर सकते हैं वह है EXEC।
तो, इस तरह एक दूरस्थ प्रक्रिया को लागू करने के बजाय:
EXEC prodserver2.mydatabase2.schema1.spProcedure1
आप उपरोक्त प्रक्रिया के लिए समानार्थी शब्द बना सकते हैं। आइए इसे synProcedure1 . कहते हैं . और इसे इस तरह से आह्वान करें:
EXEC synProcedure1
क्या हमें जारी रखना चाहिए? आप दृश्यों और कार्यों के साथ बहुत कुछ कर सकते हैं। बेशक, अगर आपके पास आवश्यक अनुमतियां हैं। लेकिन पहले, आइए चर्चा करें कि SQL सर्वर समानार्थी शब्द कैसे बनाएं।
4. आप क्रिएट के साथ SQL सर्वर समानार्थक शब्द के साथ अपनी खोज शुरू कर सकते हैं
हम इस बिंदु पर पहुंच गए हैं कि आप समानार्थी शब्द कैसे बना सकते हैं। टेबल के लिए टी-एसक्यूएल का उपयोग करके हम यह कैसे कर सकते हैं:
CREATE SYNONYM synonym1 FOR prodserver2.mydatabase2.schema1.table1
लेकिन इस चेतावनी का ध्यान रखें:
mydatabase2.schema1.table1 . की मौजूदगी और उसके लिए अनुमति की जांच की जा रही है prodserver2 . में रनटाइम तक के लिए टाल दिया गया है।
इसका मतलब है कि आपको पता नहीं चलेगा कि:
- 2 सर्वर (prodserver1 और prodserver2 ) पहले से लिंक हैं।
- डेटाबेस mydatabase2 , स्कीमा स्कीमा1 , और तालिका तालिका1 वास्तव में मौजूद हैं।
- उन संसाधनों तक आपकी पहुंच की अनुमति है।
इसलिए, समानार्थी शब्द बनाने के बाद, उन आदेशों को चलाकर परीक्षण करें जिनकी आप अपेक्षा करते हैं।
और संग्रहीत कार्यविधियों, विचारों और कार्यों के साथ, आपको उसी तरह कार्य करना चाहिए।
लेकिन वह सब नहीं है। यदि हम एक समानार्थी शब्द बना सकते हैं, तो हम इसका उपयोग करके इसे हटा भी सकते हैं:
DROP SYNONYM synonym1
और यहां एक और चेतावनी दी गई है:चूंकि आप समानार्थी शब्द को कभी भी छोड़ सकते हैं, इसलिए छोड़े गए समानार्थी शब्दों के संदर्भ केवल रनटाइम पर ही जांचे जाएंगे।
इसलिए समानार्थी शब्द छोड़ने से पहले, sys.sql_modules check की जांच करें क्योंकि अगर इसका कोई संदर्भ है।
समानार्थी शब्द बनाने और छोड़ने के लिए SQL सर्वर प्रबंधन स्टूडियो (SSMS) का उपयोग करना
अब तक, हमने SQL सर्वर पर्यायवाची शब्द बनाने और छोड़ने के लिए T-SQL का उपयोग किया है। ऐसा करते समय आप ग्राफिकल इंटरफ़ेस का उपयोग करना पसंद कर सकते हैं।
चलो गेंद को घुमाते हैं।
समानार्थी शब्द बनाना
यदि कमांड टाइप करना आपका काम नहीं है, तो समानार्थी शब्द बनाने के लिए इन चरणों का पालन करना होगा:
- SSMS चलाएँ और अपने SQL सर्वर में लॉगिन करें।
- उस डेटाबेस की तलाश करें जहां आप समानार्थी शब्द बनाना चाहते हैं।
- इसे विस्तृत करें।
- समानार्थी पर राइट-क्लिक करें फ़ोल्डर और नया समानार्थी select चुनें ।
- नाम, स्कीमा आदि सहित समानार्थक शब्द के लिए आवश्यक जानकारी के साथ फ़ॉर्म भरें।
- ठीकक्लिक करें ।
SSMS में फॉर्म का स्क्रीनशॉट नीचे दिया गया है:
समानार्थी शब्द छोड़ना
वरीयताओं की बात करें तो, समानार्थी शब्द बनाने के लिए कमांड टाइप करना मेरी तरह का काम है। लेकिन उन्हें वसीयत में छोड़ना कमांड टाइप करने की तुलना में सरल है। बेशक, यह सिर्फ मेरी पसंद है। वैसे भी, समानार्थी शब्द छोड़ते समय अनुसरण करने के चरण नीचे दिए गए हैं:
- SSMS चलाएँ और अपने SQL सर्वर में लॉगिन करें।
- उस डेटाबेस की तलाश करें जहां आप जिस समानार्थी शब्द को छोड़ना चाहते हैं वह रहता है।
- इसे विस्तृत करें।
- समानार्थक शब्द का विस्तार करें फ़ोल्डर।
- वह पर्यायवाची खोजें जिसे आप छोड़ना चाहते हैं।
- उस समानार्थी शब्द पर राइट-क्लिक करें जिसे आप छोड़ना चाहते हैं और हटाएं . चुनें ।
- ठीकक्लिक करें ।
उपरोक्त चरणों को संक्षेप में प्रस्तुत करने के लिए, ड्रॉप करने के लिए समानार्थी शब्द पर राइट-क्लिक करें, फिर हटाएं . चुनें और अंत में, ठीक . क्लिक करें ।
नीचे विंडो का एक स्क्रीनशॉट है जो हटाने की पुष्टि करने से पहले दिखाई देगा:
5. आप SQL सर्वर समानार्थी शब्द सुरक्षित कर सकते हैं
GRANT, DENY, या REVOKE का उपयोग करके, आप समानार्थी शब्द तक पहुंच को नियंत्रित कर सकते हैं।
समानार्थी समानार्थी1 . को एक चयन अनुमति देने के लिए परीक्षक . नामक उपयोगकर्ता को , आप निम्न प्रकार से करते हैं:
GRANT SELECT ON synonym1 to testuser
अन्य अनुमतियाँ जिन्हें आप समानार्थी शब्द में जोड़ या हटा सकते हैं वे निम्नलिखित हैं:
- नियंत्रण
- निष्पादित करें
- अपडेट करें
- सम्मिलित करें
- हटाएं
- परिभाषा देखें
- स्वामित्व लें
6. वह तालिका, दृश्य या प्रक्रिया नहीं मिल रही है? यह एक समानार्थी हो सकता है
आपकी टीम के एक नवागंतुक को जिन समस्याओं का सामना करना पड़ सकता है उनमें से एक "लापता" तालिका, दृश्य, प्रक्रिया या कार्य है। बेशक, अगर किसी ऑब्जेक्ट पर SELECT जारी किया जाता है, तो यह एक टेबल या व्यू हो सकता है। लेकिन वह इसे टेबल सूची या दृश्य सूची में नहीं ढूंढ सकता। और अगर उसने पहले SQL सर्वर समानार्थी शब्द का उपयोग नहीं किया है, तो यह एक अतिरिक्त समस्या है।
अभिविन्यास की कमी, दस्तावेज़ीकरण में अंतर, या आपके मानकों में अंतर को क्रम में रखा जा सकता है। यहां एक अच्छी स्क्रिप्ट है जो आपको समानार्थक शब्द की सूची और उसकी मूल वस्तु को आपके नए टीम सदस्य के सामने प्रस्तुत करने में मदद करेगी:
SELECT
a.[name]
,a.[base_object_name]
,OBJECTPROPERTYEX(OBJECT_ID(a.[name]), 'BaseType') as BaseType
,b.type_desc
FROM sys.synonyms a
INNER JOIN (SELECT DISTINCT type, type_desc from sys.all_objects) b on
CONVERT(varchar(2),OBJECTPROPERTYEX(OBJECT_ID(a.[name]), 'BaseType')) = b.type
एक "लापता" वस्तु? यदि यह समानार्थी है तो अब और नहीं।
लेकिन इससे पहले कि आप इस स्क्रिप्ट को चलाने के लिए उत्साहित हों, यहां कुछ और चीजें हैं जिन्हें आपको ध्यान में रखना चाहिए:
- sys.synonyms वह जगह है जहां सभी SQL सर्वर समानार्थी शब्द वर्तमान डेटाबेस में परिभाषित हैं।
- हमने प्रकार और प्रकार के विवरण लिए (प्रकार और type_desc क्रमशः) sys.all_objects . में . अगर आपके पास सबक्वायरी के साथ जुड़ने के अलावा कोई बेहतर विचार है, तो कृपया मुझे बताएं।
- OBJECTPROPERTYEX बेस ऑब्जेक्ट का प्रकार प्राप्त करने के लिए उपयोग किया जाता है यदि यह एक टेबल, संग्रहीत प्रक्रिया, या अन्यथा है।
- आखिरकार, यदि आपके पास इस स्क्रिप्ट को निष्पादित करने और वांछित आउटपुट प्राप्त करने के लिए आवश्यक न्यूनतम अनुमति नहीं है, तो यह आपके डीबीए या समान भूमिका वाले किसी व्यक्ति के साथ दोस्ती करने का समय है :)
लेकिन आप सोच रहे होंगे कि अगर यह अच्छा प्रदर्शन नहीं करेगा तो ये सब क्यों करें?
7. क्या SQL सर्वर समानार्थक शब्द प्रदर्शन को प्रभावित करेंगे?
यह एक सामान्य चिंता है। और पर्दे के पीछे क्या हो रहा है, यह जानने के लिए, आइए एक नज़र डालते हैं कि निष्पादन योजना में क्या होगा:
- एक समानार्थी के साथ सरलतम कोड निष्पादित करते समय (उदाहरण के लिए पर्यायवाची 1 से चुनें *), SQL सर्वर एक बाध्यकारी चरण में प्रवेश करेगा जहां आधार ऑब्जेक्ट समानार्थी को प्रतिस्थापित करेगा।
- अगला, बेस ऑब्जेक्ट को कमांड निष्पादित करने के लिए जो भी सर्वोत्तम अनुकूलन योजना है, वह वही होगी।
यहां ऊपर दिए गए 2 कथनों के संबंध में कुछ प्रश्न और उत्तर दिए गए हैं:
- एसक्यूएल सर्वर कब तक बाध्यकारी चरण करता है? उत्तर:इसमें ज्यादा समय नहीं लगता है। यह आमतौर पर पलक झपकते ही हो जाता है।
- यदि अगला चरण आधार वस्तु के साथ समान सर्वोत्तम अनुकूलन योजना का उपयोग करता है, और आधार वस्तु के लिए क्वेरी "काफी तेज" है, तो क्या यह धीमी होगी? उत्तर:नहीं, क्योंकि यह उसी निष्पादन योजना का उपयोग करेगा।
- नए सर्वर से प्रमाणीकरण के बारे में क्या? उत्तर:यदि किसी डेटाबेस को किसी नए सर्वर पर स्थानांतरित करने के कारण कुछ मामूली देरी होती है, तो वे समानार्थक शब्द के कारण नहीं होते हैं। server.database.schema.object समानार्थी या हार्डकोडिंग का उपयोग करके इसे कॉल करने का क्वेरी प्रदर्शन समान होना चाहिए क्योंकि समानार्थी मूल वस्तु के लिए सिर्फ एक वैकल्पिक नाम है। बेस ऑब्जेक्ट से धीमे प्रदर्शन को हल करें।
लेकिन इसके लिए मेरी बात न लें। आपको इसे अपनी क्वेरी निष्पादन योजना और वास्तविक प्रदर्शन के साथ स्वयं जांचना चाहिए।
निष्कर्ष
कुल मिलाकर, हमने SQL सर्वर समानार्थक शब्द के बारे में बहुत अधिक जानकारी को कवर किया है, तो चलिए संक्षेप में करते हैं।
सबसे पहले, एक समानार्थी केवल एक वैकल्पिक नाम है जो आपको ऑब्जेक्ट नाम परिवर्तन और स्थानान्तरण से बचाएगा। दूसरे, समानार्थक शब्द के लिए अच्छे उम्मीदवार टेबल, विचार, संग्रहीत कार्यविधियाँ और कार्य हैं। इसके बाद, आप एक समानार्थी से इसके मूल ऑब्जेक्ट के लिए उपयुक्त कमांड कर सकते हैं। आप इसे सुरक्षित भी कर सकते हैं। फिर, यदि आपको समानार्थी शब्दों की सूची देखने की आवश्यकता है, तो आपके पास sys.synonyms . है आपकी मदद करने के लिए। अंत में, यदि मूल ऑब्जेक्ट के साथ कोई प्रदर्शन समस्याएँ नहीं हैं, तो प्रदर्शन बहुत अधिक समस्या नहीं होनी चाहिए।
तो क्यों न आज ही इसे आजमाएं?
तुम क्या सोचते हो? हमें टिप्पणियों में बताएं।