Způsob přenosu přihlášení a hesla mezi instancemi serveru SQL Server

Překlady článku Překlady článku
ID článku: 918992 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

ÚVOD

Tento článek popisuje, jak převést přihlášení a hesla mezi instance Microsoft SQL Server 2005, Microsoft SQL Server 2008 a Microsoft SQL Server 2012 na různých serverech.

Další informace o tom, jak převést přihlášení a hesla mezi instancí jiné verze serveru SQL Server klepněte na následující číslo článku databáze Microsoft Knowledge Base:
246133 Způsob přenosu přihlášení a hesla mezi instancemi serveru SQL Server

Další informace

V tomto článku jsou různé servery A a server B. Navíc servery A a server B se systémem SQL Server 2005.

Poznámka: Tyto informace platí také pro SQL Server 2008 a SQL Server 2012.

Po přesunutí databáze z instance SQL Server na serveru A instance serveru SQL Server na serveru B, uživatelé nebudou moci přihlásit k databázi na serveru B. dále, uživatelé obdržet následující chybovou zprávu:
Přihlášení se nezdařilo pro uživatele "MyUser'. (Microsoft SQL Server, chyba: 18456)
K tomuto problému dochází, protože jste nepřevedly přihlášení a hesla z instance serveru SQL na serveru A instance serveru SQL Server na serveru B.

Přenést přihlášení, použijte jednu z následujících metod jako situace.

Metoda 1: Přihlaste se pomocí hesla pro SQL Server 2000

Chcete-li tento problém vyřešit, požádejte uživatele o přihlášení k serveru, na kterém je spuštěn SQL Server pomocí přihlášení pro SQL Server 2000.

Poznámka: Algoritmus hash hesla se automaticky aktualizuje při přihlášení uživatele pomocí hesla pro SQL Server 2000.

Metoda 2: Obnovení hesla na serveru SQL Server

Chcete-li tento problém vyřešit, obnovení hesla na serveru SQL Server a potom mimo přihlašovací skript.

Poznámka: Používá algoritmus hash hesla při obnovení hesla.

Metoda 3: Vytvořte protokol ve skriptu, který má prázdné heslo

Chcete-li vytvořit protokol ve skriptu, který má prázdné heslo, postupujte takto:
  1. Na server A spustit SQL Server Management Studio a připojte se k instanci serveru SQL Server, ze kterého přesunuta do databáze.
  2. Otevřít nové okno editoru dotazu a spusťte následující skript.
    USE master
    GO
    IF OBJECT_ID ('sp_hexadecimal') IS NOT NULL
      DROP PROCEDURE sp_hexadecimal
    GO
    CREATE PROCEDURE sp_hexadecimal
        @binvalue varbinary(256),
        @hexvalue varchar (514) OUTPUT
    AS
    DECLARE @charvalue varchar (514)
    DECLARE @i int
    DECLARE @length int
    DECLARE @hexstring char(16)
    SELECT @charvalue = '0x'
    SELECT @i = 1
    SELECT @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 + 1
    END
    
    SELECT @hexvalue = @charvalue
    GO
     
    IF OBJECT_ID ('sp_help_revlogin') IS NOT NULL
      DROP PROCEDURE sp_help_revlogin
    GO
    CREATE PROCEDURE sp_help_revlogin @login_name sysname = NULL AS
    DECLARE @name sysname
    DECLARE @type varchar (1)
    DECLARE @hasaccess int
    DECLARE @denylogin int
    DECLARE @is_disabled int
    DECLARE @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_name
    OPEN login_curs
    
    FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin
    IF (@@fetch_status = -1)
    BEGIN
      PRINT 'No login(s) found.'
      CLOSE login_curs
      DEALLOCATE login_curs
      RETURN -1
    END
    SET @tmpstr = '/* sp_help_revlogin script '
    PRINT @tmpstr
    SET @tmpstr = '** Generated ' + CONVERT (varchar, GETDATE()) + ' on ' + @@SERVERNAME + ' */'
    PRINT @tmpstr
    PRINT ''
    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
       END
    CLOSE login_curs
    DEALLOCATE login_curs
    RETURN 0
    GO
    


    Poznámka: Tento skript vytvoří dvě uložené procedury v hlavnídatabázi. Postupy jsou pojmenoványsp_hexadecimal a sp_help_revlogin.
  3. Spusťte následující příkaz:
    EXEC sp_help_revlogin
    Výstupu skriptu, který generuje sp_help_revlogin uložené procedury je přihlašovací skript. Tento přihlašovací skript vytvoří přihlášení, která mají původní identifikátor zabezpečení (SID) a původní heslo.
  4. Na serveru B spusťte SQL Server Management Studio a připojte se k instanci serveru SQL Server, ke kterému jste přesunuli do databáze.

    Důležité Dříve než přejdete ke kroku 5, přečtěte si informace v části "Poznámky".
  5. Otevřít nové okno editoru dotazu a potom spusťte skript výstup vytvořený v kroku 3.

Poznámky

Zkontrolujte následující informace před spuštěním skriptu výstup na instanci na server b
  • Pokud se pokusíte vytvořit nové přihlášení SQL Server 2012 pre-přihlášení k SQL Server 2000, je skriptovány, obdržíte následující chybě:
    Msg 15021, úroveň 16, stav 2, řádek 1
    Neplatná hodnota pro parametr heslo. Zadejte hodnotu pro parametr platný.
    Poznámka: Tato chyba se zobrazí v SQL Server 2012 z důvodu hash hesla 16 bajtů, který dodává výkazů vytvořit přihlášení a změnit PŘIHLAŠOVACÍ.

    Chcete-li vyřešit tento problém na serveru se systémem SQL Server 2012, vytvořte přihlášení, který má prázdné heslo. Chcete-li to provést, spusťte následující skript:
    CREATE LOGIN [Test] WITH PASSWORD = '', SID = 0x90FD605DCEFAE14FAB4D5EB0BBA1AECC, 
    DEFAULT_DATABASE = [master], CHECK_POLICY = ON, CHECK_EXPIRATION = OFF

    Po vytvoření přihlášení, který má prázdné heslo, může uživatel změnit heslo při dalším pokusu o přihlášení.
  • Heslo můžete použít algoritmus hash třemi způsoby:
    • VERSION_LEGACY: Tento algoritmus hash je algoritmus hash 16 bajtů pre SQL Server 2000.
    • VERSION_SHA1: Tato hodnota hash je generován pomocí algoritmu SHA1 a používá se k serveru SQL Server 2000 pomocí SQL Server 2008 R2.
    • VERSION_SHA2: Tato hodnota hash je generován pomocí algoritmus SHA2 512 a je používán SQL Server 2012.
  • V SQL Server 2008 R1 a ve starších verzích byly podporovány hodnoty hash hesla pro pre SQL Server 2000. Pokud uživatel přihlášen pomocí hesla, které používá algoritmus hash pre SQL Server 2000, hodnota hash byl upgradován použít algoritmus hash SHA1 hesla.
  • Pokud uživatel, který má heslo, které používá hash pre SQL Server 2000 na serveru se systémem SQL Server 2008 R2, to znamená, že uživatel není přihlášen k tomuto serveru.
  • Pečlivě zkontrolujte výstup skriptu. A a server B jsou v různých doménách, je nutné změnit výstup skriptu. Potom je třeba nahradit původní název domény pomocí příkazů vytvořit PŘIHLAŠOVACÍ název nové domény. Integrované přihlášení, která je udělen přístup do nové domény v původní doméně nemají stejné SID jako přihlášení. Proto jsou uživatelé osamoceného z těchto přihlášení. Další informace o řešení těchto osamocené uživatelů klepněte na následující číslo článku databáze Microsoft Knowledge Base:
    240872 Jak vyřešit problémy oprávnění při přesunu databáze mezi servery se systémem SQL Server
    Pokud A a server B ve stejné doméně, je použit stejný identifikátor SID. Proto uživatelé pravděpodobně mít synchronní kopii.
  • Ve výstupu skriptu přihlášení jsou vytvořeny pomocí zašifrovaného hesla. Je to kvůli argument HASHED v příkazu vytvořit přihlášení. Tento argument určuje, že heslo zadané po argument heslo je zatříděna již.
  • Ve výchozím nastavení lze pouze člen role sysadmin dlouhodobého serveru spustit příkaz SELECT v sys.server_principals zobrazení. Pokud není členem sysadmin pevné role serveru uděluje potřebná oprávnění pro uživatele, uživatele nelze vytvořit, nebo spustit skript výstup.
  • Kroky v tomto článku k přenosu informací výchozí databáze pro konkrétní přihlášení. Důvodem je, že výchozí databázi nemusí vždy existují na serveru B. Chcete-li definovat výchozí databáze pro přihlášení, použijte příkaz ALTER LOGIN předáním přihlašovací jméno a výchozí databáze jako argumenty.
  • Velká a malá písmena A a velká a malá písmena server B: pořadí řazení serveru A může být velká a malá písmena a může být malá a velká písmena řazení serveru B. V tomto případě uživatelé musí zadat heslo velkými písmeny po přenesení přihlášení a hesla k instanci na server B.

    Velká a malá písmena A a velká a malá písmena server B: pořadí řazení serveru A může být malá a velká písmena a server B pořadí řazení může být velká a malá písmena. Uživatele nelze v tomto případě přihlásit pomocí uživatelská jména a hesla, které přenesete k instanci na server B, pokud je splněna jedna z následujících podmínek:
    • Původní hesla obsahovat žádná písmena.
    • Všechna písmena v původních hesel jsou velkými písmeny.
    Rozlišovat malá a velká a malá písmena na obou serverech: může být malá a velká písmena řazení A i server B nebo pořadí řazení A i server B může být velká a malá písmena. V těchto případech nejsou uživatelé dojít k potížím.
  • Přihlášení, který je již v instanci na server B může mít název, který je stejný jako název ve výstupu skriptu. V tomto případě se zobrazí následující chybová zpráva při spuštění skriptu výstup na instanci na server b
    Zpráva 15025, úroveň 16 stav 1, řádek 1
    Hlavní server "MyLogin' již existuje.
    Obdobně může mít jedna přihlášení, který je již v instanci na server B SID, který je stejný jako identifikátor SID ve výstupu skriptu. V tomto případě se zobrazí následující chybová zpráva při spuštění skriptu výstup na instanci na server b
    Msg 15433, úroveň 16 stav 1, řádek 1
    Zadaný parametr sid je používán.
    Proto je nutné provést následující:
    1. Pečlivě zkontrolujte výstup skriptu.
    2. Zkontrolujte obsah sys.server_principals zobrazení v instanci na server B.
    3. Tyto chybové zprávy, případně adresa.
  • V SQL Server 2005 číslo SID pro přihlášení slouží k implementaci databáze úroveň přístupu. Přihlašovací jméno může mít jiný SID v různých databázích na serveru. V tomto případě přihlášení pouze přístup databázi, která má identifikátor SID, který odpovídá identifikátoru SID v sys.server_principals zobrazení. K tomuto problému může dojít, pokud jsou v kombinaci dvou databází z různých serverů. Chcete-li tento problém vyřešit, ručně odeberte přihlašovací jméno z databáze, která má pomocí příkazu DROP USER neshodě identifikátorů SID. Potom přihlášení znovu přidáte pomocí příkazu Vytvořit uživatele.

Odkazy

Další informace o řešení potíží s osamocené uživatelů, přejděte Poradce při potížích osamocených uživatele Web Microsoft Developer Network (MSDN).

Další informace o příkazu vytvořit přihlášení, přejděte VYTVOŘIT přihlášení (Transact-SQL) Web MSDN.

Další informace o příkazu ALTER LOGIN, přejděte ALTER LOGIN (Transact-SQL) Web MSDN.

Vlastnosti

ID článku: 918992 - Poslední aktualizace: 3. srpna 2013 - Revize: 9.0
Informace v tomto článku jsou určeny pro produkt:
  • 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
Klíčová slova: 
kbsqlsetup kbexpertiseadvanced kbhowto kbinfo kbmt KB918992 KbMtcs
Strojově přeložený článek
DŮLEŽITÉ: Tento článek je přeložen pomocí softwaru na strojový překlad Microsoft. Nepřesný či chybný překlad lze opravit prostřednictvím technologie Community Translation Framework (CTF). Microsoft nabízí strojově přeložené, komunitou dodatečně upravované články, a články přeložené lidmi s cílem zajistit přístup ke všem článkům v naší znalostní bázi ve více jazycích. Strojově přeložené a dodatečně upravované články mohou obsahovat chyby ve slovníku, syntaxi a gramatice. Společnost Microsoft není odpovědná za jakékoliv nepřesnosti, chyby nebo škody způsobené nesprávným překladem obsahu nebo jeho použitím našimi zákazníky. Více o CTF naleznete na http://support.microsoft.com/gp/machine-translation-corrections/cs.
Projděte si také anglickou verzi článku: 918992

Dejte nám zpětnou vazbu

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com