WPROWADZENIE

W tym artykule opisano jak transferować identyfikatory logowania i haseł między różnymi instancjami programów Microsoft SQL Server.

Uwaga Wystąpienia mogą być na tym samym serwerze lub na różnych serwerach, i ich wersje mogą się różnić.

Aby uzyskać więcej informacji o tym, jak transferować identyfikatory logowania i hasła pomiędzy wystąpieniami inne wersje programu SQL Server kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:

Jak transferować identyfikatory logowania i hasła pomiędzy wystąpieniami programu SQL Server, które są uruchomione starsze wersje programu SQL Server 246133

Więcej informacji

W tym artykule serwer A i server B są różne serwery.
 
Po przeniesieniu bazy danych z wystąpienia programu SQL Server na serwerze A do wystąpienia programu SQL Server na serwerze B użytkowników może być niemożliwe do logowania do bazy danych na serwer B. Dodatkowo, użytkowników może zostać wyświetlony następujący komunikat o błędzie:

Niepowodzenie logowania użytkownika 'MyUser'. (Microsoft SQL Server, błąd: 18456)

Ten problem występuje, ponieważ użytkownik przenieść identyfikatory logowania i hasła z wystąpienia programu SQL Server na serwerze, A w tym wystąpieniu programu SQL Server na serwer B.

Aby transferować identyfikatory logowania, należy użyć jednej z następujących metod, odpowiedniej do konkretnej sytuacji.

Metoda 1: Resetowanie hasła na komputerze docelowym programu SQL Server (Serwer B)

Aby rozwiązać ten problem, resetowanie hasła w komputerze serwera SQL, a następnie skrypt się logowania.

Uwaga Algorytm mieszania hasła jest używana podczas resetowania hasła.

Metoda 2: Transferować identyfikatory logowania i hasła do serwera docelowego (serwer A) przy użyciu skryptów generowanych na serwerze źródłowym (Serwer B)

Aby utworzyć dziennik w skrypcie, który ma pustego hasła, wykonaj następujące kroki:

  1. Na serwer A uruchom program SQL Server Management Studio, a następnie połączyć się z wystąpieniem programu SQL Server, z którego przeniesiono bazę danych.

  2. Otwórz nowe okno edytora zapytań w programie, a następnie uruchom następujący skrypt.

    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



    Uwaga: Ten skrypt tworzy dwie procedury przechowywane w głównej bazie danych. Procedury są nazwane sp_hexadecimal i sp_help_revlogin.

  3. Uruchom następującą instrukcję w tym samym lub nowym oknie kwerendy:

    EXEC sp_help_revlogin

    Dane wyjściowe skryptu, który generuje procedury przechowywane sp_help_revlogin jest skrypt logowania. Ten skrypt logowania tworzy logowania, które mają oryginalny identyfikator zabezpieczeń (SID) i oryginalne hasło.

Kroki na serwerze docelowym (Serwer B):

  1. Na serwer B Uruchom program SQL Server Management Studio, a następnie połączyć się z wystąpieniem programu SQL Server, do którego przeniesiono bazę danych.

    Ważne Przed przejściem do kroku 2, przejrzyj informacje w poniższej sekcji "Uwagi".

  2. Otwórz nowe okno edytora zapytań w programie, a następnie uruchom skrypt wyjścia, który jest generowany w kroku 2 powyższej procedury.

Uwagi

Przejrzyj następujące informacje przed uruchomieniem skryptu dane wyjściowe na wystąpienie na serwerze B:

  • Hasło może być mieszany w następujący sposób:

    • VERSION_SHA1: ten skrót jest generowany przy użyciu algorytmu SHA1 i jest używana w programie SQL Server 2000 za pomocą programu SQL Server 2008 R2.

    • VERSION_SHA2: ten skrót jest generowany przy użyciu algorytmu SHA2 512 i jest używana w programie SQL Server 2012 i nowszych wersjach.

  • Należy uważnie przeczytać danych wyjściowych skryptu. Jeśli serwer A i server B znajdują się w różnych domenach, musisz zmienić dane wyjściowe skryptu. Następnie trzeba zastąpić oryginalne nazwy domeny przy użyciu nowej nazwy domeny w instrukcji CREATE LOGIN. Zintegrowanego logowania, do których uzyskują dostęp w nowej domenie nie mają te same bajty SID Logins w oryginalnej domeny. W związku z tym użytkownicy są oddzielone od tych identyfikatorów logowania. Uzyskać więcej informacji dotyczących sposobu rozwiązywania tych osieroconych użytkowników, kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:

    240872 sposobu rozwiązywania problemów związanych z uprawnieniami podczas przenoszenia bazy danych między serwerami z programem SQL Server

    Jeśli serwer A i server B znajdują się w tej samej domenie, te same bajty SID jest używany. W związku z tym użytkownicy prawdopodobnie nie mają być oddzielone.

  • W danych wyjściowych skryptu logowania są tworzone przy użyciu zaszyfrowanego hasła. Wynika to z argumentu HASHED w instrukcji CREATE LOGIN. Ten argument określa hasło, które jest wprowadzana po argumencie hasło jest już mieszany.

  • Domyślnie tylko członek roli serwera sysadmin można uruchomić instrukcję SELECT w widoku sys.server_principals . Chyba, że element członkowski sysadmin ustalonej roli serwera udziela uprawnienia niezbędne do użytkowników, użytkowników nie można utworzyć lub uruchomić skrypt danych wyjściowych.

  • Kroki opisane w tym artykule nie przenosi informacji bazy danych domyślnych dla danego identyfikatora logowania. To dlatego domyślnej bazy danych zawsze mogą nie istnieć na serwer B. Do definiowania domyślnej bazy danych dla identyfikatora logowania, należy użyć instrukcji ALTER LOGIN przekazując nazwę logowania i domyślnej bazy danych jako argumenty.

  • Kolejność sortowania na serwery źródłowe i docelowe:

    • Bez uwzględniania wielkości liter serwer A i server wielkość liter B: kolejność sortowania serwera A może być rozróżniana wielkość liter, a kolejność sortowania serwera B może być rozróżniana wielkość liter. W takim przypadku użytkownicy należy wpisać haseł w wielkich liter po przeniesieniu logowania i hasła do wystąpienia na serwer B.

    • Wielkość liter serwer A i server bez uwzględniania wielkości liter B: Kolejność sortowania serwera A może być rozróżniana wielkość liter, a kolejność sortowania serwera B może być rozróżniana wielkość liter. W takim przypadku użytkownicy nie mogą zalogować się przy użyciu logowania i hasła, które transferu w tym wystąpieniu na serwer B, chyba że jest spełniony jeden z następujących warunków:

      • Oryginalnych haseł zawierają bez liter.

      • Wszystkie litery w oryginalnych haseł są wielkimi literami.

    • Rozróżniana lub nie na obu serwerach: porządek sortowania serwer A i server B może być rozróżniana wielkość liter lub porządek sortowania serwer A i server B może być rozróżniana wielkość liter. W tych przypadkach użytkownicy nie będą występować problem.

  • Identyfikator logowania, który jest już w tym wystąpieniu na serwer B może mieć nazwę, która jest taka sama jak nazwa w danych wyjściowych skryptu. W takim przypadku następujący komunikat o błędzie podczas uruchamiania skryptu dane wyjściowe na wystąpienie na serwerze B:

    Msg 15025, poziom: 16, stan: 1, wiersz 1
    Serwer główny 'MyLogin' już istnieje.

    Podobnie identyfikator logowania, który jest już w tym wystąpieniu na serwer B mogą mieć identyfikator SID, który jest taki sam, jak identyfikator SID w danych wyjściowych skryptu. W takim przypadku następujący komunikat o błędzie podczas uruchamiania skryptu dane wyjściowe na wystąpienie na serwerze B:

    Msg 15433, poziom: 16, stan: 1, wiersz 1
    Podany parametr identyfikatora sid jest w użyciu.

    W związku z tym należy wykonać następujące czynności:

    1. Należy uważnie przeczytać danych wyjściowych skryptu.

    2. Sprawdź zawartość widoku sys.server_principals w wystąpieniu na serwer B.

    3. Rozwiązania te komunikaty o błędach, stosownie do przypadku.

      W programie SQL Server 2005 identyfikatora SID dla identyfikatora logowania jest używany do wdrożenia dostępu na poziomie bazy danych. Identyfikator logowania może mieć różne identyfikatory SID w różnych baz danych na serwerze. W takim przypadku logowania dostęp tylko do bazy danych, która ma identyfikator SID, który pasuje do identyfikatora SID w widoku sys.server_principals. Ten problem może wystąpić, jeśli dwie bazy danych są łączone z różnych serwerów. Aby rozwiązać ten problem, należy ręcznie usunąć identyfikator logowania bazy danych, które ma niedopasowanie identyfikatorów SID za pomocą instrukcji DROP USER. Następnie należy dodać identyfikator logowania ponownie za pomocą instrukcji CREATE USER.

  • Jeśli zostanie podjęta próba utworzenia nowego logowania programu SQL Server 2012 przy użyciu logowania pre-SQL Server 2000, który jest inicjowane przez skrypty, pojawi się następujący komunikat o błędzie:

    Msg 15021, poziom: 16, stan 2, wiersz 1
    Nieprawidłowa wartość dla parametru HASŁA. Określ wartość parametru prawidłowy.


    Uwaga Ten błąd programu SQL Server 2012 ze względu na wartość skrótu hasła 16-bajtowe, dostarczonym do instrukcji CREATE LOGIN i zmienić identyfikator logowania.

    Aby rozwiązać ten problem na serwerze, na którym jest uruchomiony program SQL Server 2012, należy utworzyć identyfikator logowania, który ma pustego hasła. Aby to zrobić, uruchom następujący skrypt:CREATE LOGIN [Test] WITH PASSWORD = '', SID = 0x90FD605DCEFAE14FAB4D5EB0BBA1AECC, DEFAULT_DATABASE = [master], CHECK_POLICY = ON, CHECK_EXPIRATION = OFFPo utworzeniu logowania, który ma pustego hasła, użytkownik może zmienić hasło przy kolejnej próby logowania.

Metoda 3: Zaloguj się przy użyciu hasła przed SQL Server 2000

Uwaga Ta metoda jest ważne tylko, gdy program SQL Server 2000 są migrowane do nowszej obsługiwanej wersji programu SQL server.

W tej sytuacji poproś użytkownika, aby zalogować się do serwera, na którym działa program SQL Server przy użyciu logowania przed SQL Server 2000.

Uwaga Mieszania hasła jest aktualizowane automatycznie, gdy użytkownik loguje się przy użyciu hasła przed SQL Server 2000.

Powiązane artykuły

Aby uzyskać więcej informacji dotyczących rozwiązywania problemów z użytkowników oddzielonych przejdź do witryny Microsoft Developer Network (MSDN) Rozwiązywanie problemów z Orphaned Users .

Aby uzyskać więcej informacji na temat instrukcji CREATE LOGIN przejdź do witryny MSDN CREATE LOGIN (Transact-SQL) .

Aby uzyskać więcej informacji na temat instrukcji ALTER LOGIN przejdź do witryny MSDN Zmiany logowania (Transact-SQL) .

Potrzebna dalsza pomoc?

Rozwijaj swoje umiejętności

Poznaj szkolenia >

Uzyskuj nowe funkcje w pierwszej kolejności

Dołącz do niejawnych testerów firmy Microsoft >

Czy te informacje były pomocne?

Jaka jest jakość języka?
Co wpłynęło na Twoje wrażenia?

Dziękujemy za opinię!

×