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

ID článku: 918992 - Produkty, které se vztahují k tomuto článku.
Pokud jste firemní zákazník, vyhledat další řešení potíží a studijní materiály na Podpora pro malé podniky .
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:
246133Způ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 pro přihlášení k serveru, na kterém je spuštěn SQL Server pomocí přihlášení pre 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ány sp_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ů, dodané k vytvoření přihlášení a změnit PŘIHLAŠOVACÍ prohlášení.

    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 pre SQL Server 2000 hesla zašifrovaná algoritmem hash. 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:
    240872Jak 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 jsou uživatelé pravděpodobně mít synchronní kopii.
  • Ve výstupu skriptu jsou vytvářeny pomocí šifrované heslo přihlášení. To je 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ždy výchozí databáze neexistuje 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 v 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 odpovídající identifikátor SID v sys.server_principals zobrazení. K tomuto problému může dojít, pokud jsou dvě databáze kombinované 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: 21. března 2013 - Revize: 8.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 byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku: 918992

Dejte nám zpětnou vazbu