Database
 sql >> डेटाबेस >  >> RDS >> Database

लिंक्ड सर्वर पर लॉगिन कैसे काम करता है (T-SQL उदाहरण)

SQL सर्वर में लिंक किए गए सर्वर को कॉन्फ़िगर करते समय, लॉगिन सेट करना कभी-कभी भ्रमित करने वाला हो सकता है। इस लेख में, मैं एक उच्च-स्तरीय अवलोकन प्रदान करना चाहता हूं कि कैसे SQL सर्वर स्थानीय लॉगिन को लिंक किए गए सर्वर पर दूरस्थ लॉगिन में मैप करता है।

जब आप sp_addlinkedserver . का उपयोग करते हैं SQL सर्वर में एक लिंक्ड सर्वर बनाने के लिए, स्थानीय सर्वर पर सभी लॉगिन और लिंक किए गए सर्वर पर दूरस्थ लॉगिन के बीच एक डिफ़ॉल्ट मैपिंग स्वचालित रूप से बनाई जाती है। SQL सर्वर लॉगिन की ओर से लिंक किए गए सर्वर से कनेक्ट होने पर स्थानीय लॉगिन के क्रेडेंशियल का उपयोग करता है।

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

लेकिन अगर आपका स्थानीय लॉगिन नहीं है लिंक किए गए सर्वर पर (और समान क्रेडेंशियल्स के साथ) संगत लॉगिन है, कनेक्शन विफल हो जाएगा।

ऐसे मामलों में, आप sp_addlinkedsrvlogin . का उपयोग कर सकते हैं लिंक किए गए सर्वर के लिए एक लॉगिन बनाने के लिए ताकि स्थानीय लॉगिन लिंक किए गए सर्वर से तब भी जुड़ सकें, जब उनके पास लिंक किए गए सर्वर पर संबंधित लॉगिन न हो।

ऐसा करने के परिणामस्वरूप लिंक किए गए सर्वर पर अलग-अलग उपयोगकर्ताओं का उपयोग किया जा सकता है, यह इस बात पर निर्भर करता है कि उनके पास लिंक किए गए सर्वर पर संबंधित लॉगिन है या नहीं।

Windows प्रमाणीकरण मोड का उपयोग करके SQL सर्वर से जुड़े उपयोगकर्ताओं के लिए, SQL सर्वर स्वचालित रूप से Windows सुरक्षा क्रेडेंशियल का उपयोग कर सकता है जब तक कि क्लाइंट और सर्वर भेजने पर सुरक्षा खाता प्रतिनिधिमंडल उपलब्ध है, और प्रदाता Windows प्रमाणीकरण मोड का समर्थन करता है।

इस पृष्ठ के उदाहरण SQL सर्वर लॉगिन का उपयोग करते हैं (वे Windows प्रमाणीकरण मोड का उपयोग नहीं करते हैं)। ये उदाहरण स्थानीय SQL सर्वर लॉगिन का उपयोग करके विभिन्न परिदृश्यों के तहत लिंक किए गए सर्वर में लॉग इन करते समय मुझे मिलने वाले परिणाम दिखाते हैं।

उदाहरण 1 - बिना किसी स्पष्ट लॉगिन के लिंक किया गया सर्वर

पहले मैं होमर नामक एक लिंक्ड सर्वर बनाउंगा, लेकिन मैं कोई संबद्ध लॉगिन नहीं बनाऊंगा।

EXEC sp_addlinkedserver 
    @server=N'Homer', 
    @srvproduct=N'', 
    @provider=N'MSOLEDBSQL', 
    @datasrc=N'172.17.0.2',
    @catalog='Music';

यह स्वचालित रूप से स्थानीय सर्वर पर सभी लॉगिन और लिंक किए गए सर्वर पर दूरस्थ लॉगिन के बीच एक डिफ़ॉल्ट मैपिंग बनाता है।

अब मैं विभिन्न स्थानीय लॉगिन का उपयोग करके लिंक किए गए सर्वर के विरुद्ध निम्नलिखित पास-थ्रू क्वेरी चलाने का प्रयास करूंगा:

SELECT * FROM OPENQUERY(
    Homer,
    'SELECT 
       CURRENT_USER AS ''CURRENT_USER'', 
       ORIGINAL_LOGIN() AS ''ORIGINAL_LOGIN'''
);

क्वेरी के परिणाम इस प्रकार हैं।

सा

Login failed for user 'sa'.

लॉगिन विवरण :दोनों सर्वरों पर 'sa' नाम का एक लॉगिन होता है, लेकिन उनके पास अलग-अलग पासवर्ड होते हैं। दोनों sysadmin . के सदस्य हैं सर्वर भूमिका।

लिसा

+----------------+------------------+
| CURRENT_USER   | ORIGINAL_LOGIN   |
|----------------+------------------|
| dbo            | Lisa             |
+----------------+------------------+

लॉगिन विवरण :दोनों सर्वरों पर 'लिसा' नामक एक लॉगिन है, और उनके पास एक ही पासवर्ड है। दोनों sysadmin . के सदस्य हैं सर्वर भूमिका।

मिलहाउस

Login failed for user 'Milhouse'.

लॉगिन विवरण :यह लॉगिन केवल स्थानीय सर्वर पर है। लिंक किए गए सर्वर पर कोई संगत लॉगिन नहीं है।

अपू

Login failed for user 'Apu'.

लॉगिन विवरण :यह लॉगिन केवल स्थानीय सर्वर पर है। लिंक किए गए सर्वर पर कोई संगत लॉगिन नहीं है।

उदाहरण 2 - लिंक किए गए सर्वर के लिए लॉगिन जोड़ें

इसके बाद, मैं लिंक किए गए सर्वर के लिए एक लॉगिन बनाऊंगा।

EXEC sp_addlinkedsrvlogin 
    @rmtsrvname=N'Homer', 
    @useself=N'FALSE', 
    @locallogin=NULL, 
    @rmtuser=N'Maggie', 
    @rmtpassword=N'BigStrong#Passw0rd';

यह लॉगिन दूरस्थ सर्वर पर लॉगिन से मेल खाता है, इसलिए उनके बीच एक मैपिंग बनाई जाती है।

अब प्रत्येक उपयोगकर्ता निम्न क्वेरी को फिर से चलाएगा:

SELECT * FROM OPENQUERY(
    Homer,
    'SELECT 
       CURRENT_USER AS ''CURRENT_USER'', 
       ORIGINAL_LOGIN() AS ''ORIGINAL_LOGIN'''
);

क्वेरी के परिणाम इस प्रकार हैं।

सा

+----------------+------------------+
| CURRENT_USER   | ORIGINAL_LOGIN   |
|----------------+------------------|
| Maggie         | Maggie           |
+----------------+------------------+

लॉगिन विवरण :दोनों सर्वरों पर 'sa' नाम का एक लॉगिन होता है, लेकिन उनके पास अलग-अलग पासवर्ड होते हैं। दोनों sysadmin . के सदस्य हैं सर्वर भूमिका।

लिसा

+----------------+------------------+
| CURRENT_USER   | ORIGINAL_LOGIN   |
|----------------+------------------|
| Maggie         | Maggie           |
+----------------+------------------+

लॉगिन विवरण :दोनों सर्वरों पर 'लिसा' नामक एक लॉगिन है, और उनके पास एक ही पासवर्ड है। दोनों sysadmin . के सदस्य हैं सर्वर भूमिका।

मिलहाउस

+----------------+------------------+
| CURRENT_USER   | ORIGINAL_LOGIN   |
|----------------+------------------|
| Maggie         | Maggie           |
+----------------+------------------+

लॉगिन विवरण :यह लॉगिन केवल स्थानीय सर्वर पर है। लिंक किए गए सर्वर पर कोई संगत लॉगिन नहीं है।

अपू

+----------------+------------------+
| CURRENT_USER   | ORIGINAL_LOGIN   |
|----------------+------------------|
| Maggie         | Maggie           |
+----------------+------------------+

लॉगिन विवरण :यह लॉगिन केवल स्थानीय सर्वर पर है। लिंक किए गए सर्वर पर कोई संगत लॉगिन नहीं है।

इसलिए सभी स्थानीय लॉगिन लिंक किए गए सर्वर से जुड़ने में सक्षम थे। यहां तक ​​कि वे लॉगिन भी, जिनके पास लिंक किए गए सर्वर पर संबंधित दूरस्थ लॉगिन नहीं है, कनेक्ट करने में सक्षम थे। ऐसा इसलिए है क्योंकि वे सभी मैगी लॉगिन का इस्तेमाल करते थे। धन्यवाद मैगी!

उदाहरण 3 - लॉगिन प्रतिबंधित करें

अब मैं लिंक किए गए सर्वर के लिए लॉगिन अपडेट करूंगा ताकि यह मिलहाउस तक ही सीमित रहे।

लेकिन ऐसा करने के लिए, मुझे लिंक किए गए सर्वर को निकालना होगा और इसे फिर से बनाना होगा। यदि मैं ऐसा नहीं करता, तो SQL सर्वर मौजूदा मैपिंग का उपयोग करेगा, और मुझे ऊपर के समान परिणाम मिलेंगे।

EXEC sp_dropserver 'Homer', 'droplogins';

EXEC sp_addlinkedserver 
    @server=N'Homer', 
    @srvproduct=N'', 
    @provider=N'MSOLEDBSQL', 
    @datasrc=N'172.17.0.2',
    @catalog='Music';

EXEC sp_addlinkedsrvlogin 
    @rmtsrvname=N'Homer', 
    @useself=N'FALSE', 
    @locallogin='Milhouse', 
    @rmtuser=N'Maggie', 
    @rmtpassword=N'BigStrong#Passw0rd';

तो इस मामले में मैं @locallogin='Milhouse' . का उपयोग करता हूं (@locallogin=NULL . के बजाय पिछले उदाहरण की तरह)। यह केवल एक स्थानीय लॉगिन (मिलहाउस) के लिए एक लॉगिन मैपिंग जोड़ देगा।

प्रत्येक उपयोगकर्ता निम्न क्वेरी को फिर से चलाता है:

SELECT * FROM OPENQUERY(
    Homer,
    'SELECT 
       CURRENT_USER AS ''CURRENT_USER'', 
       ORIGINAL_LOGIN() AS ''ORIGINAL_LOGIN'''
);

क्वेरी के परिणाम इस प्रकार हैं।

सा

Msg 18456, Level 14, State 1, Line 1
Login failed for user 'sa'.

लॉगिन विवरण :दोनों सर्वरों पर 'sa' नाम का एक लॉगिन होता है, लेकिन उनके पास अलग-अलग पासवर्ड होते हैं। दोनों sysadmin . के सदस्य हैं सर्वर भूमिका।

लिसा

+----------------+------------------+
| CURRENT_USER   | ORIGINAL_LOGIN   |
|----------------+------------------|
| dbo            | Lisa             |
+----------------+------------------+

लॉगिन विवरण :दोनों सर्वरों पर 'लिसा' नामक एक लॉगिन है, और उनके पास एक ही पासवर्ड है। दोनों sysadmin . के सदस्य हैं सर्वर भूमिका।

मिलहाउस

+----------------+------------------+
| CURRENT_USER   | ORIGINAL_LOGIN   |
|----------------+------------------|
| Maggie         | Maggie           |
+----------------+------------------+

लॉगिन विवरण :यह लॉगिन केवल स्थानीय सर्वर पर है। लिंक किए गए सर्वर पर कोई संगत लॉगिन नहीं है।

अपू

Msg 18456, Level 14, State 1, Line 1
Login failed for user 'Apu'.

लॉगिन विवरण :यह लॉगिन केवल स्थानीय सर्वर पर है। लिंक किए गए सर्वर पर कोई संगत लॉगिन नहीं है।

तो यहां मुख्य बात यह है कि जब आप लॉगिन को केवल एक स्थानीय लॉगिन तक सीमित रखते हैं, तो यह अन्य स्थानीय लॉगिन को लिंक किए गए सर्वर से कनेक्ट होने से नहीं रोकता है। यदि उनके पास लिंक किए गए सर्वर पर संबंधित लॉगिन है, तो वे अपने स्वयं के लॉगिन मैपिंग का उपयोग करके इसे एक्सेस करने में सक्षम होंगे जो कि sp_addlinkedserver के समय बनाया गया था। चलाया गया था।

उदाहरण 4 - वास्तव में इसे केवल एक लॉगिन तक सीमित रखें

यदि आप वास्तव में इसे केवल एक लॉगिन तक सीमित रखना चाहते हैं और अधिक नहीं, तो आप sp_droplinkedsrvlogin का उपयोग कर सकते हैं सभी लॉगिन मैपिंग को छोड़ने के लिए जो sp_addlinkedserver आपके द्वारा sp_addlinkedsrvlogin execute निष्पादित करने से पहले बनाता है ।

EXEC sp_dropserver 'Homer', 'droplogins';

EXEC sp_addlinkedserver 
    @server=N'Homer', 
    @srvproduct=N'', 
    @provider=N'MSOLEDBSQL', 
    @datasrc=N'172.17.0.2',
    @catalog='Music';

EXEC sp_droplinkedsrvlogin 'Homer', NULL;

EXEC sp_addlinkedsrvlogin 
    @rmtsrvname=N'Homer', 
    @useself=N'FALSE', 
    @locallogin='Milhouse', 
    @rmtuser=N'Maggie', 
    @rmtpassword=N'BigStrong#Passw0rd';

अब प्रत्येक लॉगिन के साथ एक बार फिर क्वेरी चलाते हैं:

SELECT * FROM OPENQUERY(
    Homer,
    'SELECT 
       CURRENT_USER AS ''CURRENT_USER'', 
       ORIGINAL_LOGIN() AS ''ORIGINAL_LOGIN'''
);

क्वेरी के परिणाम इस प्रकार हैं।

सा

Msg 7416, Level 16, State 1, Line 1
Access to the remote server is denied because no login-mapping exists.

लॉगिन विवरण :दोनों सर्वरों पर 'sa' नाम का एक लॉगिन होता है, लेकिन उनके पास अलग-अलग पासवर्ड होते हैं। दोनों sysadmin . के सदस्य हैं सर्वर भूमिका।

लिसा

Msg 7416, Level 16, State 1, Line 1
Access to the remote server is denied because no login-mapping exists.

लॉगिन विवरण :दोनों सर्वरों पर 'लिसा' नामक एक लॉगिन है, और उनके पास एक ही पासवर्ड है। दोनों sysadmin . के सदस्य हैं सर्वर भूमिका।

मिलहाउस

+----------------+------------------+
| CURRENT_USER   | ORIGINAL_LOGIN   |
|----------------+------------------|
| Maggie         | Maggie           |
+----------------+------------------+

लॉगिन विवरण :यह लॉगिन केवल स्थानीय सर्वर पर है। लिंक किए गए सर्वर पर कोई संगत लॉगिन नहीं है।

अपू

Msg 7416, Level 16, State 1, Line 1
Access to the remote server is denied because no login-mapping exists.

लॉगिन विवरण :यह लॉगिन केवल स्थानीय सर्वर पर है। लिंक किए गए सर्वर पर कोई संगत लॉगिन नहीं है।

दूरस्थ लॉगिन का कॉन्फ़िगरेशन

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

उदाहरण के लिए, अगर मैगी को रिमोट सर्वर पर इस तरह बनाया गया था:

CREATE LOGIN Maggie
    WITH PASSWORD = 'BigStrong#Passw0rd';

USE Music;
CREATE USER Maggie FOR LOGIN Maggie;

GRANT SELECT ON DATABASE::Music TO Maggie;

वह बस इतना कर सकती है SELECT 'संगीत' डेटाबेस के खिलाफ बयान। इसलिए, जो कोई भी मैगी के लॉगिन का उपयोग करके लिंक किए गए सर्वर से जुड़ता है, वह केवल उसी तक सीमित रहेगा।

केवल आवश्यक अनुमतियाँ देना अच्छा अभ्यास है, लेकिन अब और नहीं।

आधिकारिक दस्तावेज़ीकरण

इस लेख का उद्देश्य लिंक किए गए सर्वर के साथ लॉगिन कैसे काम करता है, इसका एक उच्च-स्तरीय अवलोकन प्रदान करना था। ऐसे कई अन्य परिदृश्य हैं जिन्हें मैंने यहां कवर नहीं किया है।

यदि आप अधिक सीखने में रुचि रखते हैं, तो Microsoft के दस्तावेज़ीकरण के लिए निम्न लिंक देखें:

  • sp_addlinkedserver
  • sp_addlinkedsrvlogin
  • sp_testlinkedserver
  • sp_droplinkedsrvlogin
  • sp_dropserver
  • OPENQUERY()

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Azure डेटा लेक में दस्तावेज़ अपलोड करें और SSIS का उपयोग करके डेटा निर्यात करें

  2. आईआरआई कार्यक्षेत्र में डेटा प्रतिकृति

  3. SQLCMD का उपयोग करके SQL डेटाबेस रखरखाव कार्य चलाना

  4. Salesforce और OneLogin सिंगल साइन ऑन (SSO) के साथ ODBC का उपयोग करना

  5. किराए पर लें या किराए पर लें:भर्ती प्रक्रिया के लिए एक डेटा मॉडल