ID do artigo: 918992 - Última revisão: terça-feira, 1 de maio de 2012 - Revisão: 4.0

Como transferir os logons e senhas entre instâncias do SQL Server 2005 e SQL Server 2008

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
Se você faz parte de uma pequena empresa, encontre melhores recursos no site de Suporte para pequenas empresas (http://smallbusiness.support.microsoft.com/pt-br) .

Nesta página

Expandir tudo | Recolher tudo

INTRODUÇÃO

Este artigo descreve como transferir logons e senhas 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 logons e as senhas entre as instâncias de outras versões do SQL Server, clique no número do artigo correspondente para visualizá-lo na Base de Dados de Conhecimento Microsoft:
246133  (http://support.microsoft.com/kb/246133/pt-br/ ) Como transferir logons e senhas entre instâncias do SQL Server

Mais Informações

Neste artigo, o servidor A e B são diferentes. Além disso, ambos os servidores A e B estão executando o SQL Server 2005.

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

Depois de mover o banco de dados de uma instância do SQL Server no servidor A para o servidor B, os usuários podem não ser capazes de fazer logon no banco de dados do servidor B. Além disso, os usuários pode receber a seguinte mensagem de erro:
Falha no logon para o usuário 'MyUser'. (Microsoft SQL Server, Erro: 18456)
Este problema ocorre porque você não transferiu os logons e senhas da instância do SQL Server no servidor A para o servidor B.

Para transferir os logons e senhas da instância do SQL Server no servidor A para o servidor B, siga estas etapas:
  1. No servidor A, inicie o SQL Server Management Studio e conecte na instância do SQL Server a partir do qual você moveu o banco de dados.
  2. Abra uma nova janela do Editor de Consultas e execute o seguinte script.
    USE master
    IR
    SE OBJECT_ID ('sp_hexadecimal') NÃO FOR NULO
      REMOVER PROCEDIMENTO sp_hexadecimal
    IR
    CRIAR PROCEDIMENTO sp_hexadecimal
        @binvalue varbinary(256),
        @hexvalue varchar (514) SAÍDA
    COMO
    DECLARAR @charvalue varchar (514)
    DECLARAR @i int
    DECLARAR @length int
    DECLARAR @hexstring char(16)
    SELECIONAR @charvalue = '0x'
    SELECIONAR @i = 1
    SELECIONAR @length = DATALENGTH (@binvalue)
    SELECIONAR @hexstring = '0123456789ABCDEF'
    ENQUANTO (@i <= @length)
    COMEÇAR
      DECLARAR @tempint int
      DECLARAR @firstint int
      DECLARAR @secondint int
      DECLARAR @tempint = CONVERTER (int, SUBSTRING(@binvalue,@i,1))
      SELECIONAR @firstint = PLANTA (@tempint/16)
      SELECIONAR @secondint = @tempint - (@firstint*16)
      SELECIONAR @charvalue = @charvalue +
        SUBCADEIA DE CARACTERES (@hexstring, @firstint+1, 1) +
        SUBCADEIA DE CARACTERES (@hexstring, @secondint+1, 1)
      SELECIONAR @i = @i + 1
    FINAL
    
    SELECIONAR @hexvalue = @charvalue
    IR
     
    SE OBJECT_ID ('sp_help_revlogin') NÃO ESTÁ NULO
      REMOVER PROCEDIMENTO sp_help_revlogin
    IR
    CRIAR PROCEDIMENTO sp_help_revlogin @login_name sysname = NULO COMO
    DECLARAR @name sysname
    DECLARAR @type varchar (1)
    DECLARAR @hasaccess int
    DECLARAR @denylogin int
    DECLARAR @is_disabled int
    DECLARAR @PWD_varbinary  varbinary (256)
    DECLARAR @PWD_string  varchar (514)
    DECLARAR @SID_varbinary varbinary (85)
    DECLARAR @SID_string varchar (514)
    DECLARAR @tmpstr  varchar (1024)
    DECLARAR @is_policy_checked varchar (3)
    DECLARAR @is_expiration_checked varchar (3)
    
    DECLARAR @defaultdb sysname
     
    SE (@login_name É NULO)
      DECLARAR login_curs CURSOR PARA
    
          SELECIONAR p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin DE 
    sys.server_principals p JUNÇÃO ESQUERDA sys.syslogins l
          LIGADO ( l.name = p.name ) ONDE p.type IN ( 'S', 'G', 'U' ) E p.name <> 'sa'
    OUTRO
      DECLARAR login_curs CURSOR PARA
    
    
          SELECIONAR p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin DE 
    sys.server_principals p JUNÇÃO ESQUERDA sys.syslogins l
          LIGADO ( l.name = p.name ) ONDE p.type IN ( 'S', 'G', 'U' ) E p.name = @login_name
    ABRIR login_curs
    
    OBTER PRÓXIMO DE login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin
    SE (@@fetch_status = -1)
    COMEÇAR
      IMPRIMIR 'Nenhum logon(s) encontrado.'
      FECHAR login_curs
      DESALOCAR login_curs
      RETORNAR -1
    FINAL
    DEFINIR @tmpstr = '/* sp_help_revlogin script '
    IMPRIMIR @tmpstr
    DEFINIR @tmpstr = '** Gerado ' + CONVERTER (varchar, GETDATE()) + ' no ' + @@SERVERNAME + ' */'
    IMPRIMIR @tmpstr
    IMPRIMIR ''
    ENQUANTO (@@fetch_status <> -1)
    COMEÇAR
      SE (@@fetch_status <> -2)
      COMEÇAR
        IMPRIMIR ''
        DEFINIR @tmpstr = '-- Login: ' + @name
        IMPRIMIR @tmpstr
        SE (@type EM ( 'G', 'U'))
        COMEÇAR -- NT conta autenticada/grupo
    
          DEFINIR @tmpstr = 'CRIAR LOGON ' + QUOTENAME( @name ) + ' DO WINDOWS COM DEFAULT_DATABASE = [' + @defaultdb + ']'
        FINAL
        COMEÇAR OUTRO -- autenticação SQL Server
            -- obter senha e sid
                DEFINIR @PWD_varbinary = CONVERTER (LOGINPROPERTY( @name, 'PasswordHash' ) AS varbinary (256) )
            EXEC sp_hexadecimal @PWD_varbinary, @PWD_string SAÍDA
            EXEC sp_hexadecimal @SID_varbinary,@SID_string SAÍDA
     
            -- obter estado da política de senha
            SELECIONAR @is_policy_checked = CASO is_policy_checked QUANDO ENTÃO O 1 'LIGADO' QUANDO ENTÃO O 0 'DESLIGADO' OUTRO FINAL NULO DO sys.sql_logins WHERE name = @name
            SELECIONAR @is_expiration_checked = CASO is_expiration_checked QUANDO ENTÃO O 1 'LIGADO' QUANDO ENTÃO O 0 'DESLIGADO' OUTRO FINAL NULO DO sys.sql_logins WHERE name = @name
     
                DEFINIR @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' COM SENHA = ' + @PWD_string + ' HASHED, SID = ' + @SID_string + ', DEFAULT_DATABASE = [' + @defaultdb + ']'
    
            SE ( @is_policy_checked NÃO É NULA)
            COMEÇAR
              DEFINIR @tmpstr = @tmpstr + ', CHECK_POLICY = ' + @is_policy_checked
            FINAL
            SE ( @is_expiration_checked NÃO É NULA)
            COMEÇAR
              DEFINIR @tmpstr = @tmpstr + ', CHECK_EXPIRATION = ' + @is_expiration_checked
            FINAL
        FINAL
        SE (@denylogin = 1)
        COMEÇAR -- logon tem acesso negado.
          DEFINIR @tmpstr = @tmpstr + '; NEGAR CONEXÃO SQL PARA ' + QUOTENAME( @name )
        FINAL
        OUTRO SE (@hasaccess = 0)
        COMEÇAR -- logon existe mas não tem acesso.
          DEFINIR @tmpstr = @tmpstr + '; REVOGAR CONEXÃO SQL PARA ' + QUOTENAME( @name )
        FINAL
        SE (@is_disabled = 1)
        COMEÇAR -- logon está desativado.
          DEFINIR @tmpstr = @tmpstr + '; ALTERAR LOGON ' + QUOTENAME( @name ) + ' DESATIVAR'
        FINAL
        IMPRIMIR @tmpstr
      FINAL
    
      BUSCAR PRÓXIMO DE login_curs ATÉ @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin
       FINAL
    FECHAR login_curs
    DESALOCAR login_curs
    RETORNAR 0
    IR
    
    Observação Este script cria dois procedimentos armazenados no banco de dados master. Os dois procedimentos armazenados são nomeados de procedimento armazenado sp_hexadecimal e sp_help_revlogin.
  3. Execute a seguinte instrução.
    EXEC sp_help_revlogin
    O script de saída que foi gerado pelo procedimento armazenado sp_help_revlogin no script do logon. Este script de logon cria os logons que tem o Identificador de Segurança (SID) e a senha original.
  4. No servidor B, inicie o SQL Server Management Studio e conecte à instância do SQL Server para a qual você moveu o banco de dados.

    Importante Antes de ir para a etapa 5, reveja a informação na seção "Observações".
  5. Abra uma nova janela do Editor de Consultas e execute o script de saída que é gerada na etapa 3.

Observações

Reveja a informação seguinte antes de executar o script de saída na instância no servidor B:
  • Reveja o script de saída cuidadosamente. Se o servidor A e B estão em domínios diferentes, você tem que modificar o script de saída. Em seguida, você deve substituir o nome do domínio original com o nome do novo domínio na instrução CRIAR LOGON. Os logons integrados que tem acesso garantido no novo domínio não tem o mesmo SID como os logons do domínio original. Portanto, os usuários são órfãos destes logons. Para obter mais informações sobre como resolver estes usuários órfãos, clique no número do artigo correspondente para visualizá-lo na Base de Dados de Conhecimento Microsoft:
    240872  (http://support.microsoft.com/kb/240872/pt-br/ ) Como resolver problemas de permissão ao mover o banco de dados entre os servidores que estão executando o SQL Server
    Se o servidor A e B estão no mesmo domínio, o mesmo SID é usado. Portanto, os usuários não são suscetíveis de serem órfãos.
  • No script de saída, os logons são criados usando a senha criptografada. Isto é por causa do argumento HASHED na instrução CRIAR LOGON. Este argumento especifica que a senha que foi inserida depois do argumento SENHA já foi transformada em hash.
  • Por padrão, somente um membro da função do servidor fixo sysadmin pode executar uma instrução SELECIONAR da visualização sys.server_principals. Pelo menos um membro da função do servidor fixo sysadmin garante as permissões necessárias aos usuários, os usuários podem criar ou executar o script de saída.
  • As etapas neste artigo não transferem a informação do banco de dados padrão para um logon particular. Isto é porque o banco de dados pode não existir sempre no servidor B. Para definir o banco de dados padrão para um logon, use a instrução ALTER LOGIN passando no nome do logon e no banco de dados padrão como argumentos.
  • A ordem de classificação do servidor A pode não diferenciar maiúscula de minúscula, e a ordem de classificação do servidor B pode diferenciar maiúscula de minúscula. Neste caso, os usuários devem digitar todas as letras nas senhas como letras maiúsculas depois de transferir os logons e as senhas para a instância no servidor B.

    Em alternativa, a ordem de classificação do servidor A pode diferenciar maiúsculas de minúsculas e a ordem de classificação do servidor B não pode diferenciar maiúsculas de minúsculas. Neste caso, os usuários não podem fazer logon usando os logons e as senhas que transferiu para a instância no servidor B a menos que uma das seguintes condições seja verdadeira:
    • As senhas originais não contêm letras.
    • Todas as letras nas senhas originais são maiúsculas.
    A ordem de classificação do servidor A e B pode diferenciar maiúsculas de minúsculas ou a ordem de classificação do servidor A e B não podem diferenciar maiúsculas de minúsculas. Nestes casos, os usuários não experimentam um problema.
  • Um logon que já está na instância no servidor B pode ter um nome que é o mesmo como um nome no script de saída. Neste caso, você recebe a seguinte mensagem de erro ao executar o script de saída na instância no servidor B:
    Msg 15025, Nível 16, Estado 1, Linha 1
    O servidor principal 'MyLogin' já existe.
    Da mesma forma, um logon que já existe na instância no servidor B pode ter um SID que é o mesmo do que um SID no script de saída. Neste caso, você recebe a seguinte mensagem de erro ao executar o script de saída na instância no servidor B:
    Msg 15433, Nível 16, Estado 1, Linha 1
    O sid do parâmetro fornecido está em uso.
    Portanto, você deve fazer o seguinte:
    1. Reveja o script de saída cuidadosamente.
    2. Examine os conteúdos do sys.server_principals visualizando na instância no servidor B.
    3. Encaminhe estas mensagens de erro adequadamente.
  • No SQL Server 2005, o SID para um logon é usado como a base para implementação do acesso de nível do banco de dados. Um logon pode ter dois SIDs diferentes em dois bancos de dados diferentes em um servidor. Neste caso, o logon somente pode acessar o banco de dados que tenha o SID que combine com o SID na visualização do sys.server_principals. Este problema pode ocorrer se os dois bancos de dados são consolidados em dois servidores diferentes. Para resolver este problema, remova manualmente o logon do banco de dados que tem um SID incompatível usando a instrução REMOVER USUÁRIO. Em seguida, adicione o logon novamente usando a instrução CRIAR USUÁRIO.

Referências

Para obter mais informações sobre como resolver problemas de usuários órfãos, visite o seguinte site da Microsoft Developer Network (MSDN):
http://msdn.microsoft.com/pt-br/library/ms175475.aspx (http://msdn.microsoft.com/pt-br/library/ms175475.aspx)
Para obter mais informações sobre a instrução CRIAR LOGON, visite o seguinte site MSDN:
http://msdn.microsoft.com/pt-br/library/ms189751.aspx (http://msdn.microsoft.com/pt-br/library/ms189751.aspx)
Para obter mais informações sobre a instrução ALTER LOGIN, visite o site MSDN:
http://msdn.microsoft.com/pt-br/library/ms189828.aspx (http://msdn.microsoft.com/pt-br/library/ms189828.aspx)

A informação contida neste artigo aplica-se a:
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Workgroup Edition
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL Server 2005 Enterprise Edition
Palavras-chave: 
kbsqlsetup kbexpertiseadvanced kbhowto kbinfo KB918992