आप वर्तमान में ऑफ़लाइन हैं, आपका इंटरनेट पुनः कनेक्‍ट होने की प्रतीक्षा कर रहे हैं

SQL Server के इंस्टेंस के बीच लॉगिन और पासवर्ड कैसे स्थानांतरित करें

भूमिका
यह आलेख विभिन्न सर्वर पर Microsoft SQL Server 2005, Microsoft SQL Server 2008 और Microsoft SQL Server 2012 के इंस्टेंस के बीच लॉगिन और पासवर्ड स्थानांतरित करने के तरीके का वर्णन करता है.

SQL Server के अन्य संस्करणों के इंस्टेंस के बीच लॉगिन और पासवर्ड स्थानांतरित करने के तरीके के बारे में अधिक जानकारी के लिए, Microsoft नॉलेज बेस में आलेख देखने के लिए निम्न आलेख संख्या क्लिक करें:
246133 SQL Server के इंस्टेंस के बीच लॉगिन और पासवर्ड कैसे स्थानांतरित करें
अधिक जानकारी
इस आलेख में, सर्वर A और B विभिन्न सर्वर हैं. इसके अतिरिक्त, सर्वर A और सर्वर B, SQL Server 2005 चला रहे हैं.

नोट यह जानकारी SQL Server 2008 और SQL Server 2012 पर भी लागू होती है.

आपके द्वारा सर्वर A पर SQL Server के इंस्टेंस से सर्वर B पर SQL Server के इंस्टेंस पर डेटाबेस ले जाने के बाद, हो सकता है कि उपयोगकर्ता सर्वर B पर डेटाबेस में लॉग इन करने में असमर्थ रहें. इसके अतिरिक्त, उपयोगकर्ताओं को निम्न त्रुटि संदेश मिल सकता है:
उपयोगकर्ता 'MyUser' के लिए लॉगिन विफल रहा. (Microsoft SQL Server, त्रुटि: 18456)
यह समस्या इसलिए उत्पन्न होती है क्योंकि आपने सर्वर A पर SQL Server के इंस्टेंस से सर्वर B पर SQL Server के इंस्टेंस पर लॉगिन और पासवर्ड स्थानांतरित नहीं किए.

लॉगिन स्थानांतरित करने के लिए, निम्न पद्धतियों में से अपनी परिस्थिति के लिए उचित एक का उपयोग करें.

पद्धति 1: पूर्व-SQL Server 2000 पासवर्ड का उपयोग करके लॉग इन करें

इस समस्या का समाधान करने के लिए, उपयोगकर्ता को पूर्व-SQL Server 2000 लॉगिन का उपयोग करके SQL Server चलाने वाले सर्वर में लॉग इन करने के लिए कहें.

नोट उपयोगकर्ता द्वारा पूर्व-SQL Server 2000 पासवर्ड का उपयोग करके उपयोगकर्ता द्वारा लॉग इन किए जाने पर पासवर्ड हैशिंग स्वचालित रूप से अद्यतित हो जाती है.

पद्धति 2: SQL Server में पासवर्ड रीसेट करें

इस समस्या का समाधान करने के लिए, SQL Server में पासवर्ड रीसेट करें और फिर लॉगिन से स्क्रिप्ट निकालें.

नोट आपके द्वारा पासवर्ड रीसेट किए जाने पर पासवर्ड हैशिंग एल्गोरिद्म का उपयोग किया जाता है.

पद्धति 3: रिक्त पासवर्ड वाली एक लॉग इन स्क्रिप्ट बनाएँ

रिक्त पासवर्ड वाली लॉग इन स्क्रिप्ट बनाने के लिए, इन चरणों का पालन करें:
  1. सर्वर A पर, SQL Server प्रबंधन स्टुडियो प्रारंभ करें और फिर SQL Server के उस इंस्टेंस से कनेक्ट हों जिससे आपने डेटाबेस स्थानांतरित किया.
  2. नई क्वेरी संपादक विंडो खोलें और फिर निम्न स्क्रिप्ट चलाएँ.
    USE masterGOIF OBJECT_ID ('sp_hexadecimal') IS NOT NULL  DROP PROCEDURE sp_hexadecimalGOCREATE PROCEDURE sp_hexadecimal    @binvalue varbinary(256),    @hexvalue varchar (514) OUTPUTASDECLARE @charvalue varchar (514)DECLARE @i intDECLARE @length intDECLARE @hexstring char(16)SELECT @charvalue = '0x'SELECT @i = 1SELECT @length = DATALENGTH (@binvalue)SELECT @hexstring = '0123456789ABCDEF'WHILE (@i <= @length)BEGIN  DECLARE @tempint int  DECLARE @firstint int  DECLARE @secondint int  SELECT @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1))  SELECT @firstint = FLOOR(@tempint/16)  SELECT @secondint = @tempint - (@firstint*16)  SELECT @charvalue = @charvalue +    SUBSTRING(@hexstring, @firstint+1, 1) +    SUBSTRING(@hexstring, @secondint+1, 1)  SELECT @i = @i + 1ENDSELECT @hexvalue = @charvalueGO IF OBJECT_ID ('sp_help_revlogin') IS NOT NULL  DROP PROCEDURE sp_help_revloginGOCREATE PROCEDURE sp_help_revlogin @login_name sysname = NULL ASDECLARE @name sysnameDECLARE @type varchar (1)DECLARE @hasaccess intDECLARE @denylogin intDECLARE @is_disabled intDECLARE @PWD_varbinary  varbinary (256)DECLARE @PWD_string  varchar (514)DECLARE @SID_varbinary varbinary (85)DECLARE @SID_string varchar (514)DECLARE @tmpstr  varchar (1024)DECLARE @is_policy_checked varchar (3)DECLARE @is_expiration_checked varchar (3)DECLARE @defaultdb sysname IF (@login_name IS NULL)  DECLARE login_curs CURSOR FOR      SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM sys.server_principals p LEFT JOIN sys.syslogins l      ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name <> 'sa'ELSE  DECLARE login_curs CURSOR FOR      SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM sys.server_principals p LEFT JOIN sys.syslogins l      ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name = @login_nameOPEN login_cursFETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denyloginIF (@@fetch_status = -1)BEGIN  PRINT 'No login(s) found.'  CLOSE login_curs  DEALLOCATE login_curs  RETURN -1ENDSET @tmpstr = '/* sp_help_revlogin script 'PRINT @tmpstrSET @tmpstr = '** Generated ' + CONVERT (varchar, GETDATE()) + ' on ' + @@SERVERNAME + ' */'PRINT @tmpstrPRINT ''WHILE (@@fetch_status <> -1)BEGIN  IF (@@fetch_status <> -2)  BEGIN    PRINT ''    SET @tmpstr = '-- Login: ' + @name    PRINT @tmpstr    IF (@type IN ( 'G', 'U'))    BEGIN -- NT authenticated account/group      SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' FROM WINDOWS WITH DEFAULT_DATABASE = [' + @defaultdb + ']'    END    ELSE BEGIN -- SQL Server authentication        -- obtain password and sid            SET @PWD_varbinary = CAST( LOGINPROPERTY( @name, 'PasswordHash' ) AS varbinary (256) )        EXEC sp_hexadecimal @PWD_varbinary, @PWD_string OUT        EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT         -- obtain password policy state        SELECT @is_policy_checked = CASE is_policy_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name        SELECT @is_expiration_checked = CASE is_expiration_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name             SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' WITH PASSWORD = ' + @PWD_string + ' HASHED, SID = ' + @SID_string + ', DEFAULT_DATABASE = [' + @defaultdb + ']'        IF ( @is_policy_checked IS NOT NULL )        BEGIN          SET @tmpstr = @tmpstr + ', CHECK_POLICY = ' + @is_policy_checked        END        IF ( @is_expiration_checked IS NOT NULL )        BEGIN          SET @tmpstr = @tmpstr + ', CHECK_EXPIRATION = ' + @is_expiration_checked        END    END    IF (@denylogin = 1)    BEGIN -- login is denied access      SET @tmpstr = @tmpstr + '; DENY CONNECT SQL TO ' + QUOTENAME( @name )    END    ELSE IF (@hasaccess = 0)    BEGIN -- login exists but does not have access      SET @tmpstr = @tmpstr + '; REVOKE CONNECT SQL TO ' + QUOTENAME( @name )    END    IF (@is_disabled = 1)    BEGIN -- login is disabled      SET @tmpstr = @tmpstr + '; ALTER LOGIN ' + QUOTENAME( @name ) + ' DISABLE'    END    PRINT @tmpstr  END  FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin   ENDCLOSE login_cursDEALLOCATE login_cursRETURN 0GO


    नोट यह स्क्रिप्ट मास्टर डेटाबेस में दो संग्रहीत कार्यविधियाँ बनाती है. इन कार्यविधियों के नाम sp_hexadecimal और sp_help_revlogin हैं.
  3. निम्न विवरण चलाएँ: 
    EXEC sp_help_revlogin
    sp_help_revlogin संग्रहीत कार्यविधि द्वारा जेनरेट की जाने वाली आउटपुट स्क्रिप्ट लॉगिन स्क्रिप्ट होती है. यह लॉगिन स्क्रिप्ट मूल सुरक्षा पहचानकर्ता (SID) और मूल पासवर्ड वाले लॉगिन बनाती है.
  4. सर्वर B पर, SQL Server प्रबंधन स्टुडियो प्रारंभ करें और फिर SQL Server के उस इंस्टेंस से कनेक्ट हों जिससे आपने डेटाबेस स्थानांतरित किया.

    महत्वपूर्ण चरण 5 पर जाने से पहले, "टिप्पणियाँ" अनुभाग में जानकारी की समीक्षा करें.
  5. नई क्वेरी संपादक विंडो खोलें और फिर चरण 3 में जेनरेट की गई आउटपुट स्क्रिप्ट चलाएँ.

टिप्पणियाँ

सर्वर B पर इंस्टेंस पर आउटपुट स्क्रिप्ट चलाने से पहले निम्न जानकारी की समीक्षा करें:
  • अगर आप स्क्रिप्ट किए गए पूर्व-SQL Server 2000 लॉगिन का उपयोग करके एक नया SQL Server 2012 लॉगिन बनाने का प्रयास करते हैं, तो आपको निम्न त्रुटि मिलती है:
    Msg 15021, Level 16, State 2, Line 1
    PASSWORD पैरामीटर के लिए अमान्य मान दिया गया. एक मान्य पैरामीटर मान निर्दिष्ट करें.
    नोट आपको SQL Server 2012 में यह त्रुटि CREATE LOGIN औक ALTER LOGIN कथनों के लिए आपूरित 16-बाइट पासवर्ड हैश के कारण मिलती है.

    SQL Server 2012 चलाने वाले सर्वर पर इस समस्या का समाधान करने के लिए, रिक्त पासवर्ड वाला एक लॉगिन बनाएँ. ऐसा करने के लिए, निम्न स्क्रिप्ट चलाएँ:
    CREATE LOGIN [Test] WITH PASSWORD = '', SID = 0x90FD605DCEFAE14FAB4D5EB0BBA1AECC, DEFAULT_DATABASE = [master], CHECK_POLICY = ON, CHECK_EXPIRATION = OFF

    रिक्त पासवर्ड वाला लॉगिन बनाने के बाद, उपयोगकर्ता अगले लॉगिन प्रयास में पासवर्ड बदल सकता है.
  • पासवर्ड को तीन तरीके से हैश किया जा सकता है:
    • VERSION_LEGACY: यह हैश 16-बाइट का पूर्व-SQL Server 2000 हैश होता है.
    • VERSION_SHA1: यह हैश SHA1 एल्गोरिद्म का उपयोग करके जेनरेट किया जाता है और इसका उपयोग SQL Server 2000 से SQL Server 2008 R2 तक में किया जाता है.
    • VERSION_SHA2: यह हैश SHA2 512 एल्गोरिद्म का उपयोग करके जेनरेट किया जाता है और इसका उपयोग SQL Server 2012 में किया जाता है.
  • SQL Server 2008 R1 और पूर्व संस्करणों में, पूर्व-SQL Server 2000 पासवर्ड हैश समर्थित थे. जब कोई उपयोगकर्ता पूर्व-SQL Server 2000 हैश का उपयोग करने वाले पासवर्ड का उपयोग करके लॉग इन करता है, तो हैश को SHA1 पासवर्ड हैश का उपयोग करने के लिए नवीनीकृत किया गया था.
  • अगर SQL Server 2008 R2 चलाने वाले किसी सर्वर पर वह उपयोगकर्ता मौजूद है जिसके पास पूर्व-SQL Server 2000 हैश का उपयोग करने वाला पासवर्ड है, तो इसका यह अर्थ है कि उपयोगकर्ता ने उस सर्वर पर लॉग इन नहीं किया है.
  • आउटपुट स्क्रिप्ट की ध्यानपूर्वक समीक्षा करें. अगर सर्वर A और सर्वर B विभिन्न डोमेन में हैं, तो आपको आउटपुट स्क्रिप्ट को बदलना होगा. फिर, आपको CREATE LOGIN कथनों में नए डोमेन नाम का उपयोग करके मूल डोमेन नाम को प्रतिस्थापित करना होगा. एकीकृत लॉगिन जिन्हें नए डोमेन में पहुँच प्रदान की गई है, उनमें मूल डोमेन में लॉगिन जैसी समान SID नहीं होती है. इसलिए, उपयोगकर्ता इन लॉगिन से ऑर्फ़न होते हैं. इस ऑर्फ़न उपयोगकर्ताओं का समाधान करने के तरीके के बारे में अधिक जानकारी के लिए, Microsoft नॉलेज बेस में आलेख देखने के लिए निम्न आलेख संख्या क्लिक करें:
    240872 SQL Server चलाने वाले सर्वर के बीच डेटाबेस स्थानांतरित करने पर अनुमति समस्याओं का समाधान करने का तरीका
    अगर सर्वर A और सर्वर B समान डोमेन में हैं, तो समान SID का उपयोग किया जाता है. इसलिए उपयोगकर्ताओं का ऑर्फ़न होना असंभावित होता है.
  • आउटपुट स्क्रिप्ट में, एन्क्रिप्ट किए गए पासवर्ड का उपयोग करके लॉगिन बनाए जाते हैं. CREATE LOGIN कथन में HASHED तर्क के कारण ऐसा है. यह तर्क निर्दिष्ट करता है कि PASSWORD तर्क के बाद दर्ज किया गया पासवर्ड पहले से हैश किया गया है.
  • डिफ़ॉल्ट रूप से, केवल sysadmin नियत सर्वर भूमिका का सदस्य sys.server_principals दृश्य से SELECT कथन चला सकता है. जब तक कि sysadmin नियत सर्वर भूमिका का सदस्य उपयोगकर्ताओं को आवश्यक अनुमतियाँ नहीं देता है, तब तक उपयोगकर्ता आउटपुट स्क्रिप्ट बना या चला नहीं सकते.
  • इस आलेख में दिए गए चरण किसी विशेष लॉगिन के लिए डिफ़ॉल्ट डेटाबेस जानकारी को स्थानांतरित नहीं करते हैं. ऐसा इसलिए है क्योंकि डिफ़ॉल्ट डेटाबेस हमेशा सर्वर B पर मौजूद नहीं हो सकता. किसी लॉगिन हेतु डिफ़ॉल्ट डेटाबेस परिभाषित करने के लिए, लॉगिन नाम और डिफ़ॉल्ट डेटाबेस को तर्कों के रूप में पास करके ALTER LOGIN कथन का उपयोग करें.
  • केस-असंवेदी सर्वर A और केस-संवेदी सर्वर B: सर्वर A का सॉर्ट क्रम केस-असंवेदी हो सकता है और सर्वर B का सॉर्ट क्रम केस-संवेदी हो सकता है. इस मामले में, उपयोगकर्ताओं को आपके द्वारा सर्वर B पर इंस्टेंस में लॉगिन और पासवर्ड स्थानांतरित किए जाने के बाद पासवर्ड को सभी अपरकेस अक्षरों में लिखना होगा.

    केस-अंवेदी सर्वर A और केस-असंवेदी सर्वर B: सर्वर A का सॉर्ट क्रम केस-संवेदी हो सकता है और सर्वर B का सॉर्ट क्रम केस-असंवेदी हो सकता है. इस मामले में, उपयोगकर्ता निम्न में कोई एक स्थिति सही होने तक आपके द्वारा सर्वर B पर इंस्टेंस में स्थानांतरित किए जाने वाले लॉगिन और पासवर्ड का उपयोग करके लॉग इन नहीं कर सकते:
    • मूल पासवर्ड में कोई अक्षर नहीं है.
    • मूल पासवर्ड में सभी अक्षर अपरकेस अक्षर हैं.
    दोनों सर्वर पर केस-संवेदी या केस-असंवेदी: सर्वर A और सर्वर B दोनों का सॉर्ट क्रम केस-संवेदी हो सकता है या सर्वर A और सर्वर B दोनों का सॉर्ट क्रम केस-असंवेदी हो सकता है. इन मामलों में, उपयोगकर्ताओं को कोई समस्या नहीं आती.
  • सर्वर B पर इंस्टेंस में पहले से मौजूद लॉगिन में वह नाम हो सकता है जो आउटपुट स्क्रिप्ट में नाम के समान होता है. इस मामले में, आपको सर्वर B पर इंस्टेंस पर आउटपुट स्क्रिप्ट चलाने पर निम्न त्रुटि संदेश मिलता है:
    Msg 15025, Level 16, State 1, Line 1
    सर्वर मूल 'MyLogin' पहले से मौजूद है.
    इसी तरह, सर्वर B पर इंस्टेंस में पहले से मौजूद लॉगिन में वह SID हो सकती है, जो आउटपुट स्क्रिप्ट में SID के समान होती है. इस मामले में, आपको सर्वर B पर इंस्टेंस पर आउटपुट स्क्रिप्ट चलाने पर निम्न त्रुटि संदेश मिलता है:
    Msg 15433, Level 16, State 1, Line 1
    आपूरित पैरामीटर sid का उपयोग किया जा रहा है.
    इसलिए, आपको निम्न करना होगा:
    1. आउटपुट स्क्रिप्ट की ध्यानपूर्वक समीक्षा करें.
    2. सर्वर B पर इंस्टेंस में sys.server_principals दृश्य की सामग्री की जाँच करें.
    3. इन त्रुटि संदेशों को जैसे उचित हो, संबोधित करें.
  • SQL Server 2005 में, लॉगिन के लिए SID का उपयोग डेटाबेस-स्तरीय पहुँच कार्यान्वित करने के लिए किया जाता है. लॉगिन में सर्वर पर विभिन्न डेटाबेस में विभिन्न SID हो सकती हैं. इस मामले में, लॉगिन केवल उस डेटाबेस तक पहुँच सकता है, जिसमें sys.server_principals दृश्य की SID से मेल खाने वाली SID होती है. अगर विभिन्न सर्वर से दो डेटाबेस संयोजित किए जाते हैं, तो यह समस्या उत्पन्न हो सकता है. इस समस्या का समाधान करने के लिए, DROP USER कथन का उपयोग करके SID बेमेलता वाले डेटाबेस से मैन्युअल रूप से लॉगिन निकालें. फिर, CREATE USER कथन का उपयोग करके फिर से लॉगिन जोड़ें.
संदर्भ
ऑर्फ़न उपयोगकर्ताओं की समस्या का निवारण करने के तरीके के बारे में अधिक जानकारी के लिए, ऑर्फ़न उपयोगकर्ताओं की समस्या का निवारण करें Microsoft डेवलपर नेटवर्क (MSDN) वेबसाइट पर जाएँ.

CREATE LOGIN कथन के बारे में अधिक जानकारी के लिए, CREATE LOGIN (Transact-SQL) MSDN वेबसाइट पर जाएँ.

ALTER LOGIN कथन के बारे में अधिक जानकारी के लिए, ALTER LOGIN (Transact-SQL) MSDN वेबसाइट पर जाएँ.
गुण

आलेख ID: 918992 - पिछली समीक्षा: 11/29/2013 22:12:00 - संशोधन: 5.0

Microsoft SQL Server 2005 Standard Edition, Microsoft SQL Server 2005 Workgroup Edition, Microsoft SQL Server 2005 Developer Edition, Microsoft SQL Server 2005 Enterprise Edition, Microsoft SQL Server 2008 Standard, Microsoft SQL Server 2008 Workgroup, Microsoft SQL Server 2008 Developer, Microsoft SQL Server 2008 Enterprise, Microsoft SQL Server 2012 Standard, Microsoft SQL Server 2012 Developer, Microsoft SQL Server 2012 Enterprise

  • kbsqlsetup kbexpertiseadvanced kbhowto kbinfo KB918992
प्रतिक्रिया