SQL सर्वर में समानार्थक शब्द डेटाबेस ऑब्जेक्ट हैं जो स्थानीय रूप से या दूरस्थ सर्वर पर मौजूद डेटाबेस ऑब्जेक्ट को वैकल्पिक नाम देते हैं। साथ ही, वे मूल वस्तु में किसी भी परिवर्तन से एप्लिकेशन की सुरक्षा के लिए एक अमूर्त परत प्रदान करते हैं।
टी-एसक्यूएल स्क्रिप्ट में, हम डेटाबेस ऑब्जेक्ट्स को संदर्भित करने के लिए 3-भाग नामों का उपयोग करते हैं। प्रारूप है:
[डेटाबेस]। [स्कीमा]। [ऑब्जेक्ट]
उदाहरण के लिए, मान लें कि हमारे पास निम्न डेटाबेस अवसंरचना है:
- डेटाबेस का नाम:[Azuredemodatabase]
- स्कीमा:[सेल्सएलटी]
- वस्तु (तालिका का नाम):उत्पाद
3-भाग के नाम वाला सेलेक्ट स्टेटमेंट नीचे दिया गया है:
SELECT [ProductID]
,[Name]
,[ProductNumber]
,[Color]
,[StandardCost]
,[ListPrice]
,[Size]
,[Weight]
,[ProductCategoryID]
,[ProductModelID]
,[SellStartDate]
,[SellEndDate]
,[DiscontinuedDate]
,[ThumbNailPhoto]
,[ThumbnailPhotoFileName]
,[rowguid]
,[ModifiedDate]
FROM [Azuredemodatabase].[SalesLT].[Product]
इसी तरह, एक दूरस्थ सर्वर 4-भाग नामकरण सम्मेलन का उपयोग करता है। अतिरिक्त भाग [दूरस्थ सर्वर नाम] है। इसलिए, प्रारूप होगा
[सर्वर का नाम]। [डेटाबेस]। [स्कीमा]। [ऑब्जेक्ट]।
आइए कल्पना करें कि आपको [SalesLT] का नाम बदलने की आवश्यकता है।[उत्पाद] तालिका में [ProductData] .
यह तालिका कई संग्रहीत कार्यविधियों, कार्यों और विचारों में संदर्भित है। इसलिए, तालिका के नवीनतम नाम का उपयोग करने के लिए आपको प्रश्नों या क्लाइंट अनुप्रयोगों में ऐसे सभी संदर्भों को संशोधित करने की आवश्यकता है।
आप डेटाबेस ऑब्जेक्ट का संदर्भ देने वाला एक समानार्थी शब्द बना सकते हैं और इसे अपने SQL प्रश्नों में उपयोग कर सकते हैं। यदि कोई परिवर्तन होता है, तो आपको केवल समानार्थी परिभाषा को फिर से बनाना होगा। आपको प्रश्नों में किसी ऑब्जेक्ट संदर्भ को बदलने की आवश्यकता नहीं होगी क्योंकि हम समानार्थी शब्द का उपयोग कर रहे हैं।
एक अलग मामले में, हम एक समानार्थी शब्द बनाते हैं जो तालिका [Azuredemodatabase] की ओर इशारा करता है। [SalesLT]। [उत्पाद]। फिर, हम तालिका छोड़ते हैं और समान नाम के साथ एक दृश्य बनाते हैं। इस मामले में, एक समानार्थी स्वचालित रूप से दृश्य को संदर्भित करेगा क्योंकि ऑब्जेक्ट बाइंडिंग ऑब्जेक्ट नाम के साथ होता है।
यदि आप किसी ऑब्जेक्ट को किसी भिन्न डेटाबेस में ले जाते हैं, तो पर्यायवाची परिवर्तन करते समय प्रयासों को कम करने में आपकी सहायता करता है। एक बार जब आप समानार्थी को फिर से बनाते हैं, तो सभी SQL क्वेरी स्वचालित रूप से नवीनतम ऑब्जेक्ट स्थान प्राप्त कर लेती हैं।
आप डेटाबेस ऑब्जेक्ट्स के नाम छुपाने के लिए समानार्थी शब्द का भी उपयोग कर सकते हैं। उपयोगकर्ता आधार तालिका को क्वेरी करने के बजाय परिणाम प्राप्त करने के लिए समानार्थक शब्द पूछ सकते हैं।
आप निम्न ऑब्जेक्ट के लिए SQL सर्वर में एक समानार्थी को परिभाषित कर सकते हैं:
- उपयोगकर्ता-निर्धारित तालिका
- संग्रहीत प्रक्रिया
- देखें
- स्केलर और इनलाइन तालिका-मूल्यवान फ़ंक्शन
- स्थानीय और वैश्विक अस्थायी तालिकाएं
- CLR संग्रहीत कार्यविधि, कार्य (तालिका-मूल्यवान, कुल, अदिश)
नोट:समानार्थी नाम डेटाबेस में अद्वितीय होना चाहिए।
SQL सर्वर में समानार्थक शब्द का प्रयोग कहां करें
हम T-SQL कथन में समानार्थक शब्द का उपयोग कर सकते हैं, जैसे चयन करें, अपडेट करें, निष्पादित करें, सम्मिलित करें, हटाएं और उप-प्रश्न करें।
हालांकि, हम डेटा डेफिनिशन लैंग्वेज (DDL) स्टेटमेंट जैसे Create और Alter में समानार्थी शब्द का उपयोग नहीं कर सकते हैं। साथ ही, समानार्थी शब्द चेक बाधाओं, गणना किए गए कॉलम, डिफ़ॉल्ट अभिव्यक्तियों, नियम अभिव्यक्तियों, स्कीमा-बाध्य दृश्यों और कार्यों के लिए उपयुक्त नहीं हैं।
स्थानीय सर्वर में SQL सर्वर में एक समानार्थी शब्द बनाएँ
SQL सर्वर में समानार्थी शब्द बनाने के लिए, हम CREATE SYNONYM स्टेटमेंट का उपयोग करते हैं। सिंटैक्स निम्न है:
CREATE SYNONYM <synonym_name, sysname, sample_synonym>
FOR <schema_name, sysname, Production>.<object_name, sysname, Product>
GO
उदाहरण के लिए, आइए पर्यायवाची [MyProductCatalog] . बनाएं [Azuredemodatabase].[SalesLT].[उत्पाद] . के लिए ।
[Azuredemodatabase] के लिएCREATE SYNONYM MyProductCatalog FOR [Azuredemodatabase].[SalesLT].[Product]
एक बार यह बन जाने के बाद, आप तालिका के नाम को समानार्थी शब्द से बदल सकते हैं जैसा कि नीचे दिखाया गया है। यह आंतरिक रूप से आधार तालिका का संदर्भ देता है जिसे हमने CREATE SYNONYM कथन में संदर्भित किया है।
SELECT [ProductID]
,[Name]
,[ProductNumber]
,[Color]
,[StandardCost]
,[ListPrice]
,[Size]
,[Weight]
,[ProductCategoryID]
,[ProductModelID]
,[SellStartDate]
,[SellEndDate]
,[DiscontinuedDate]
,[ThumbNailPhoto]
,[ThumbnailPhotoFileName]
,[rowguid]
,[ModifiedDate]
FROM MyProductCatalog
दूरस्थ सर्वर पर डेटाबेस में एक समानार्थी शब्द बनाएं
मान लीजिए कि वस्तु एक दूरस्थ सर्वर [एबीसी] में मौजूद है। प्रश्नों में 4-भाग का नाम निर्दिष्ट करने से बचने के लिए आप एक समानार्थी शब्द बना सकते हैं। नीचे दी गई क्वेरी में, मूल वस्तु [MyRemoteServer] में है:
EXEC sp_addlinkedserver MyRemoteServer;
GO
USE tempdb;
GO
CREATE SYNONYM MyProductCatalog FOR MyRemoteServer.[Azuredemodatabase].[SalesLT].[Product]
GO
SQL सर्वर प्रबंधन स्टूडियो के साथ एक समानार्थी शब्द बनाना
समानार्थी शब्द बनाने के लिए, हम SQL सर्वर प्रबंधन स्टूडियो के GUI का उपयोग कर सकते हैं।
- अपने SQL इंस्टेंस से कनेक्ट करें, डेटाबेस का विस्तार करें, और समानार्थी फ़ोल्डर में नेविगेट करें।
- उस पर राइट-क्लिक करें और नया पर्यायवाची चुनें।
- समानार्थी नाम, समानार्थी स्कीमा, डेटाबेस नाम, ऑब्जेक्ट स्कीमा, ऑब्जेक्ट प्रकार और नाम के लिए आवश्यक विवरण दर्ज करें।
हमारे उदाहरण में, हम स्कीमा [HumanResources] में एक समानार्थी शब्द बनाते हैं, जो तालिका स्कीमा के समान है:
स्क्रिप्ट . पर क्लिक करें नीचे के रूप में एक समान टी-एसक्यूएल स्क्रिप्ट प्राप्त करने के लिए:
USE [AdventureWorks2017]
GO
CREATE SYNONYM [HumanResources].[MyEmpData] FOR
[AdventureWorks2017].[HumanResources].[Employee]
GO
उपयोगकर्ता द्वारा परिभाषित कार्यों के लिए समानार्थी
सबसे पहले, UDF dbo.TestSynonym . बनाएं नीचे दी गई स्क्रिप्ट का उपयोग करना:
CREATE FUNCTION dbo.TestSynonyn (@ID int)
RETURNS int
AS
BEGIN
IF @ID < 0
BEGIN
SET @ID=100
END
RETURN(@ID);
END;
GO
फिर, इसके लिए dbo.UDFTest . नाम से एक समानार्थी शब्द बनाएं . आप समानार्थी शब्द का उपयोग करके यूडीएफ को कॉल कर सकते हैं और क्वेरी परिणाम प्राप्त कर सकते हैं:
CREATE SYNONYM dbo.UDFTest FOR dbo.TestSynonyn;
GO
Declare @ID INT=-10
Select @ID as OrigninalValue, dbo.UDFTest(@ID) as modifiedValue
अपडेट स्टेटमेंट और समानार्थी शब्द
मान लीजिए कि आप SQL तालिका में कोई मान अपडेट करना चाहते हैं। यदि आपने इस पर एक समानार्थी परिभाषित किया है, तो आप इसका उपयोग भी कर सकते हैं। उदाहरण के लिए, नीचे दिया गया अपडेट स्टेटमेंट समानार्थी [Perofmancetest] का उपयोग करता है SQL तालिका नाम के स्थान पर:
Update performancetest set [Name]='Updated New value' where ID=1
समानार्थी शब्द छोड़ना
डेटाबेस में एक विशिष्ट पर्यायवाची को छोड़ने के लिए आप DROP SYNONYM स्टेटमेंट का उपयोग कर सकते हैं। नीचे दी गई क्वेरी ड्रॉप हो जाती है [EmpData ] AdventureWorks2017 . में डेटाबेस:
Use AdventureWorks2017
Drop Synonym EmpData
SQL सर्वर में डेटाबेस समानार्थक शब्द की सूची प्राप्त करना
मान लें कि आप डेटाबेस में मौजूदा समानार्थक शब्द उनके मूल ऑब्जेक्ट के साथ जानना चाहते हैं। आप sys.synonyms . को क्वेरी कर सकते हैं संबंधित डेटाबेस में सिस्टम कैटलॉग दृश्य:
SELECT
name,
base_object_name,
type
FROM
sys.synonyms
क्वेरी आउटपुट में, आपको निम्न जानकारी मिलती है:
- समानार्थी नाम
- आधार वस्तु (3-भाग या 4-भाग वस्तु का नाम)
- वस्तु प्रकार (एसएन =पर्यायवाची)
क्या होगा यदि हम समानार्थी के मूल ऑब्जेक्ट को संशोधित करें?
आइए एक समानार्थी के आधार वस्तु को संशोधित करने के प्रभाव पर विचार करें। हमारे पास कई कार्य करने के लिए एक प्रश्न है:
- एक समानार्थी शब्द बनाएं (समानार्थी नाम [dbo] है।[EmpData] आधार वस्तु के लिए [AdventureWorks2017].[DBO].[Emp] )
- आधार वस्तु (तालिका) को छोड़ दें [AdventureWorks2017]।[DBO]।[Emp]
- [AdventureWorks2017] डेटाबेस में [DBO] नाम के साथ एक दृश्य बनाएं।[Emp]।
USE [AdventureWorks2017]
GO
CREATE SYNONYM [dbo].[EmpData] FOR [AdventureWorks2017].[DBO].[Emp]
GO
Drop table [AdventureWorks2017].[DBO].[Emp]
Go
Create view [DBO].[Emp]
as
Select * from dbo.Employee
go
जैसा कि पहले उल्लेख किया गया है, समानार्थी अपने नाम का उपयोग करके किसी वस्तु को बांधता है। इस प्रकार, इसे तालिका के बजाय दृश्य को इंगित करना चाहिए। इस मामले में, [dbo]।[Emp] तालिका मौजूद नहीं है।
जैसा कि नीचे दिखाया गया है, यह [AdventureWorks2017] . में एक दृश्य है डेटाबेस।
वैकल्पिक रूप से, आप OBJECTPROPERTYEX() . का उपयोग कर सकते हैं समानार्थी के वस्तु आधार प्रकार की जाँच करने के लिए:
SELECT OBJECTPROPERTYEX(OBJECT_ID('Emp'), 'BaseType') AS BaseType;
GO
यहाँ, आधार प्रकार डेटाबेस दृश्य का संदर्भ देता है। SQL तालिका के मामले में, आपको U . मिलता है आउटपुट में।
क्या समानार्थी शब्द क्वेरी के प्रदर्शन को नकारात्मक रूप से प्रभावित करते हैं?
कई डेटाबेस पेशेवर SQL सर्वर में समानार्थक शब्द का उपयोग नहीं करना पसंद करते हैं। उनका कहना है कि SQL सर्वर को समानार्थी से आधार तालिका को हल करने में एक अतिरिक्त कदम उठाना पड़ता है। इस प्रकार, यह एक नकारात्मक प्रभाव उत्पन्न कर सकता है।
आइए क्वेरी प्रदर्शन का परीक्षण करें। हम तालिका के नाम और समानार्थी शब्द से रिकॉर्ड पुनर्प्राप्त करते हैं:
Create table TestTable
(
ID int,
[Name] varchar(20)
)
Insert into TestTable values (1, 'Temporary Data')
GO 10000
Create synonym performancetest for TestTable
SET STATISTICS IO ON;
Select * from TestTable
Go
Select * from performancetest
सबसे पहले, आइए वास्तविक निष्पादन योजना की जाँच करें। दोनों क्वेरी बैचों की निष्पादन योजना और ऑपरेटर लागत समान हैं:
इसी तरह, वांछित आउटपुट प्राप्त करने के लिए दोनों प्रश्नों में 41 तार्किक रीड और एक स्कैन गिनती है।
SQL सर्वर क्वेरी निष्पादन के बाध्यकारी चरण में समानार्थी आधार ऑब्जेक्ट नामों को हल करता है। यह क्वेरी ऑप्टिमाइज़ेशन चरण से पहले होता है। इसलिए, आप एक समान निष्पादन योजना और कोई प्रदर्शन प्रभाव नहीं देखते हैं। नतीजतन, आप अक्सर उपयोग की जाने वाली वस्तुओं के लिए लंबे 3-भाग या 4-भाग नामों से बचने के लिए समानार्थक शब्द का उपयोग कर सकते हैं। यह क्वेरी के प्रदर्शन को प्रभावित नहीं करता है।
इसका मतलब यह नहीं है कि आप प्रत्येक वस्तु के लिए एक पर्यायवाची शब्द बनाते हैं जैसे कि तालिका, संग्रहीत कार्यविधि, कार्य, दृश्य। प्रश्नों में उन्हें त्वरित रूप से संदर्भित करने के लिए आप अक्सर उपयोग की जाने वाली वस्तुओं के लिए उनका उपयोग कर सकते हैं।
निष्कर्ष
SQL सर्वर में समानार्थी शब्द फायदेमंद हो सकते हैं। वे 3-भाग या 4-भाग लंबे नामों से बचकर डेटाबेस ऑब्जेक्ट नामों को सरल बनाते हैं। आप उनका उपयोग स्थानीय और दूरस्थ दोनों वस्तुओं को संदर्भित करने के लिए कर सकते हैं। यह कोई प्रदर्शन समस्या उत्पन्न नहीं करता है। इसलिए, आप प्रश्नों को लिखने में लचीलेपन के लिए उनका उपयोग करके एक्सप्लोर कर सकते हैं। हालांकि, सबसे अच्छी बात यह है कि केवल SQL स्क्रिप्ट में अक्सर उपयोग की जाने वाली वस्तुओं के लिए समानार्थक शब्द को परिभाषित करना है।