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

ÚVOD

Tento článek popisuje, jak převést přihlášení a hesla mezi instance serveru 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 jak přenést přihlášení a hesla mezi instancemi serveru SQL Server

Další informace

V tomto článku server A a server B jsou jiné servery. Navíc server 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 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: Přihlaste se pomocí hesla pro verzi starší než 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 je aktualizováno automaticky při přihlášení uživatele pomocí hesla pre 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 pak 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 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 masterGO
    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 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 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 pomocí přihlášení pre SQL Server 2000, je skriptovány, obdržíte 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í.
  • Heslo můžete použít algoritmus hash třemi způsoby:
    • VERSION_LEGACY: Tato hodnota 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 slouží v 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.
  • Existuje-li 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ý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.
  • 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í. K 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.

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) .
Vlastnosti

ID článku: 918992 - Poslední kontrola: 16. 1. 2017 - Revize: 1

Váš názor