Jak přenést přihlášení a hesla mezi instancemi serveru SQL Server

Platí pro: Microsoft SQL Server 2005 Standard EditionMicrosoft SQL Server 2005 Workgroup EditionMicrosoft SQL Server 2005 Developer Edition

ÚVOD


Tento článek popisuje způsob přenosu přihlášení a hesla mezi různé instance Microsoft SQL Server.

Poznámka: Instance může být na stejném serveru nebo na různých serverech a jejich verze se může lišit.

Další informace o tom, jak přené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 jak přenést přihlášení a hesla mezi instancemi serveru SQL Server, které používají starší verze serveru SQL Server

Další informace


V tomto článku server A a server B jsou jiné servery.
 
Po přesunutí databáze z instance serveru SQL 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řevést přihlášení, použijte jednu z následujících metod podle vaší situace.

Metoda 1: Obnovení hesla v cílovém počítači serveru SQL Server (Server B)

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

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

Metoda 2: Převést do cílového serveru (Server A) pomocí skriptů, které jsou generovány na zdrojovém serveru (Server B) uživatelská jména a hesla

Chcete-li vytvořit protokol ve skriptu, který má prázdné heslo, postupujte takto:
  1. Na server A spustit SQL Server Management Studio a potom připojit 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. Stejnou nebo novém okně dotazu 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.

Kroky na cílovém serveru (Server B):

  1. Na serveru B spusťte SQL Server Management Studio a potom připojit k instanci serveru SQL Server, ke kterému jste přesunuli do databáze.

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

Poznámky

Zkontrolujte následující informace před spuštěním skriptu výstup na instanci na server b

  • Následujícími způsoby můžete použít algoritmus hash hesla:
    • 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 slouží v SQL Server 2012 a novějších verzích.
  • Pečlivě zkontrolujte výstupu skriptu. Pokud je server 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í název nové domény v příkazech vytvořit přihlášení. Integrované přihlášení, která je udělen přístup v nové doméně nemají stejné SID jako přihlášení původní domény. 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řesunutí databáze mezi servery se systémem SQL Server

    Pokud server A a server B jsou ve stejné doméně, je použit stejný identifikátor SID. Uživatelé jsou proto nepravděpodobné, že by mít synchronní kopii.
  • Ve výstupu skriptu přihlášení vytvořené pomocí šifrované heslo. Je to kvůli argument HASHED v příkazu vytvořit přihlášení. Tento argument určuje, že hesla, která je zadána po argument heslo je zatříděna již.
  • Ve výchozím nastavení může 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 informace o výchozí databázi pro konkrétní přihlášení. Toto je, protože výchozí databázi nemusí vždy existovat 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ázi jako argumenty.
  • Řazení na serverech zdroj a cíl:
    • Velká a malá písmena A a velká a malá písmena server B: může být malá a velká písmena řazení serveru A a server B pořadí řazení může být malá a velká písmena. 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: Může být malá a velká písmena řazení serveru A 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 na 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.
    • Velká a malá písmena nebo velká a malá písmena u obou serverů: server A a server B pořadí řazení může být malá a velká písmena nebo pořadí řazení, server A a 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, stavu 1, řádek 1
    Server, ke kterému se hlavní 'MyLogin' již existuje.
    Podobně přihlášení, které je již v instanci na server B může být identifikátor 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, stavu 1, řádek 1
    Zadaný parametr sid je používán.
    Proto je nutné provést následující:
    1. Pečlivě zkontrolujte výstupu 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 je 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í lze pouze přístup k databázi, která má identifikátor SID, který odpovídá identifikátoru SID v sys.server_principals zobrazení. Tomuto problému může dojít, pokud jsou kombinovány 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.
  • Pokud se pokusíte vytvořit nové přihlášení SQL Server 2012 pomocí přihlášení pre SQL Server 2000, je skriptovány, zobrazí se následující chybová zpráva:

    Msg 15021, úroveň 16, stav 2, řádek 1
    Neplatná hodnota pro parametr heslo. Zadejte hodnotu pro parametr platný.

    Poznámka: V SQL Server 2012 z důvodu algoritmus hash hesla 16 bajtů, který dodává výkazů vytvořit přihlášení a změnit PŘIHLAŠOVACÍ obdržíte tuto chybu.

    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í.

Metoda 3: Přihlaste se pomocí hesla pre SQL Server 2000

Poznámka: Tato metoda je funkční pouze v případě, že provádíte migraci na nejnovější podporovanou verzi serveru SQL server SQL Server 2000.

V takovém případě požádejte uživatele o 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 je aktualizováno automaticky při přihlášení uživatele pomocí hesla pre SQL Server 2000.

Odkazy


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

Další informace o příkazu vytvořit přihlášení přejděte na web MSDN Vytvořit LOGIN (Transact-SQL) .

Další informace o příkazu ALTER přihlášení přejděte na web MSDN ALTER LOGIN (Transact-SQL) .