Como transferir os inícios de sessão e as palavras-passe entre instâncias do SQL Server 2005 e SQL Server 2008

Traduções de Artigos Traduções de Artigos
Artigo: 918992 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

INTRODUÇÃO

Este artigo descreve como transferir os inícios de sessão e as palavras-passe entre instâncias do Microsoft SQL Server 2005 e Microsoft SQL Server 2008, em diferentes servidores.

Para obter mais informações sobre como transferir os inícios de sessão e as palavras-passe entre instâncias de outras versões do SQL Server, clique no número do artigo existente abaixo para visualizar o artigo na base de dados de conhecimento da Microsoft:
246133 Como transferir os inícios de sessão e as palavras-passe entre instâncias do SQL Server

Mais Informação

Neste artigo, o servidor A e servidor B são diferentes servidores. Para além disso, o servidor A e o servidor B possuem a versão do SQL Server 2005.

Nota Esta informação também se aplica ao SQL Server 2008.

Após deslocar uma base de dados da instância do SQL Server no servidor A para a instância do SQL Server no servidor B, os utilizadores poderão não ser capazes de iniciar a sessão na base de dados no servidor B. Adicionalmente, os utilizadores poderão receber a seguinte mensagem de erro:
Falha de início de sessão para utilizador 'MyUser'. (Microsoft SQL Server, Erro: 18456)
Este problema ocorre porque não transferiu os inícios de sessão e as palavras-passe da instância do SQL Server no servidor A para a instância do SQL Server no servidor B.

Para transferir os inícios de sessão e as palavras-passe da instância do SQL Server no servidor A para a instância do SQL Server no servidor B, siga estes passos:
  1. No servidor A, inicie o SQL Server Management Studio e, de seguida, ligue à instância do SQL Server a partir da qual moveu a base de dados.
  2. Abra uma nova janela do Editor de Consultas e execute o seguinte script.
    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
    
    Nota Este script cria dois procedimentos armazenados na base de dados principal. Os dois procedimentos armazenados têm o nome de procedimento armazenado sp_hexadecimal e o procedimento armazenado sp_help_revlogin.
  3. Execute a seguinte instrução.
    EXEC sp_help_revlogin
    O script de resultado que é gerado pelo procedimento armazenado sp_help_revlogin é o script de início de sessão. Este script de início de sessão cria os inícios de sessões que possuem o Identificador de Segurança (SID) original, assim como a palavra-passe original.
  4. No servidor B, inicie o SQL Server Management Studio e, de seguida, ligue à instância do SQL Server para a qual moveu a base de dados.

    Importante Antes de avançar para o passo 5, reveja as informações na secção "Comentários".
  5. Abra uma nova janela do Editor de Consultas e execute o script de resultado que é gerado no passo 3.

Comentários

Reveja as seguintes informações antes de executar o script de resultado na instância no servidor B:
  • Reveja cuidadosamente o script de resultado. Se o servidor A e o servidor B se encontrarem em diferentes domínios, terá de modificar o script de resultado. E, de seguida, terá de substituir o nome do domínio original com o novo nome de domínio nas instruções CREATE LOGIN. O inícios de sessão integrados aos quais é concedido acesso no novo domínio, não possuem o mesmo SID dos inícios de sessão no domínio original. Como tal, aos utilizadores ficam órfãos destes inícios de sessão. Para mais informações sobre como resolver estes utilizadores órfãos, clique no número de artigo que se segue para visualizar o artigo na Base de Dados de Conhecimento da Microsoft:
    240872 Como solucionar questões de permissão quando mover uma base de dados entre servidores que se encontrem a executar o SQL Server
    Se o servidor A e o servidor B se encontrarem no mesmo domínio, será utilizado o mesmo SID. Como tal, os utilizadores provavelmente não estão órfãos.
  • No script de resultado, os inícios de sessão são criados utilizando a palavra-passe encriptada. Isto deve-se ao argumento HASHED na instrução CREATE LOGIN. Este argumento especifica que a palavra-passe que é introduzida após o argumento PASSWORD já está convertida.
  • Por defeito, apenas um membro da função de servidor fixa sysadmin poderá executar uma instrução SELECT a partir da vista sys.server_principals. A não ser que um membro da função de servidor fixa sysadmin conceda as necessárias permissões aos utilizadores, estes não poderão criar ou executar o script de resultado.
  • Os passos neste artigo não transferem a informação de base de dados predefinida para um início de sessão particular. Isto deve-se ao facto da base de dados predefinida nem sempre poder existir no servidor B. Para definir a base de dados predefinida para um início de sessão, utilize a instrução ALTER LOGIN, passando o início de sessão e a base de dados predefinida como argumentos.
  • A ordenação do servidor A poderá ser insensível a maiúsculas e minúsculas e a ordenação do servidor B poderá ser sensível a maiúsculas e minúsculas. Neste caso, os utilizadores deverão escrever todas as letras nas palavras-passe como letras maiúsculas após transferir os inícios de sessão e as palavras-passe para a instância no servidor B.

    Por outro lado, a ordenação do servidor A poderá ser sensível a maiúsculas e minúsculas e a ordenação do servidor B poderá ser insensível a maiúsculas e minúsculas. Neste caso, os utilizadores não poderão iniciar a sessão utilizando os mesmos inícios de sessão e palavras-passe que transferiu para a instância no servidor B, excepto se uma das condições for verdadeira:
    • As palavras-passe não possuem letras.
    • Todas as letras nas palavras-passe originais possuem letras em maiúsculas.
    A ordenação quer do servidor A, quer do servidor B poderá ser sensível a maiúsculas e minúsculas ou, por outro lado a ordenação do servidor A e do servidor B poderá ser insensível a maiúsculas e minúsculas. Nestes casos, os utilizadores não experienciam um problema.
  • Um início de sessão que já se encontrar na instância no servidor B, poderá possuir um nome que é o mesmo nome do script de resultado. Neste caso, recebe a mesma mensagem de erro quando executa o script de resultado na instância no servidor B:
    Msg 15025, Nível 16, Estado 1, Linha 1
    O "MyLogin" principal do servidor, já existe.
    De forma semelhante, um início de sessão que já se encontrar na instância no servidor B, poderá possuir um SID que é o mesmo SID do script de resultado. Neste caso, recebe a mesma mensagem de erro quando executa o script de resultado na instância no servidor B:
    Msg 15433, Nível 16, Estado 1, Linha 1
    O sid de parâmetro fornecido está a ser utilizado.
    Como tal, deverá efectuar os seguintes procedimentos:
    1. Reveja cuidadosamente o script de resultado.
    2. Examine os conteúdos da vistasys.server_principals na instância no servidor B.
    3. Aborde em conformidade estas mensagens de erro.
  • No SQL Server 2005, o SID para o início de sessão é utilizado como a base para a implementação de acesso a nível de base de dados. Um início de sessão poderá possuir dois diferentes SID em duas diferentes bases de dados num servidor. Neste caso, o início de sessão apenas poderá aceder à base de dados que possui o SID que corresponde ao SID na vista sys.server_principals. Este problema poderá ocorrer caso as duas bases de dados sejam consolidadas a partir de dois diferentes servidores. Para resolver este problema, remova manualmente o início de sessão da base de dados que possui um erro de correspondência do SID... utilizando a instrução DROP USER. Então, adicione novamente o início de sessão, utilizando a instrução CREATE USER.

Referências

Para obter mais informações sobre como resolver problemas de utilizadores órfãos, visite o seguinte Web site Microsoft Developer Network (MSDN):
http://msdn2.microsoft.com/en-us/library/ms175475.aspx
Para mais informações acerca da instrução CREATE LOGIN, visite o seguinte Web site MSDN:
http://msdn2.microsoft.com/en-us/library/ms189751.aspx
Para mais informações acerca da instrução ALTER LOGIN, visite o seguinte Web site MSDN:
http://msdn2.microsoft.com/en-us/library/ms189828.aspx

Propriedades

Artigo: 918992 - Última revisão: 17 de setembro de 2011 - Revisão: 3.0
A informação contida neste artigo aplica-se a:
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL 2005 Server Workgroup
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL 2005 Server Enterprise
Palavras-chave: 
kbsqlsetup kbexpertiseadvanced kbhowto kbinfo KB918992

Submeter comentários

 

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