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

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 masterGOIF OBJECT_ID ('sp_hexadecimal') IS NOT NULL  DROP PROCEDURE sp_hexadecimalGOCREATE PROCEDURE sp_hexadecimal    @binvalue varbinary(256),    @hexvalue varchar (514) OUTPUTASDECLARE @charvalue varchar (514)DECLARE @i intDECLARE @length intDECLARE @hexstring char(16)SELECT @charvalue = '0x'SELECT @i = 1SELECT @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 + 1ENDSELECT @hexvalue = @charvalueGO IF OBJECT_ID ('sp_help_revlogin') IS NOT NULL  DROP PROCEDURE sp_help_revloginGOCREATE PROCEDURE sp_help_revlogin @login_name sysname = NULL ASDECLARE @name sysnameDECLARE @type varchar (1)DECLARE @hasaccess intDECLARE @denylogin intDECLARE @is_disabled intDECLARE @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_nameOPEN login_cursFETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denyloginIF (@@fetch_status = -1)BEGIN  PRINT 'No login(s) found.'  CLOSE login_curs  DEALLOCATE login_curs  RETURN -1ENDSET @tmpstr = '/* sp_help_revlogin script 'PRINT @tmpstrSET @tmpstr = '** Generated ' + CONVERT (varchar, GETDATE()) + ' on ' + @@SERVERNAME + ' */'PRINT @tmpstrPRINT ''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   ENDCLOSE login_cursDEALLOCATE login_cursRETURN 0GO
    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): Para mais informações acerca da instrução CREATE LOGIN, visite o seguinte Web site MSDN: Para mais informações acerca da instrução ALTER LOGIN, visite o seguinte Web site MSDN:
Propriedades

ID do Artigo: 918992 - Última Revisão: 09/17/2011 22:37:00 - Revisão: 3.0

Microsoft SQL Server 2005 Standard Edition, Microsoft SQL 2005 Server Workgroup, Microsoft SQL Server 2005 Developer Edition, Microsoft SQL 2005 Server Enterprise

  • kbsqlsetup kbexpertiseadvanced kbhowto kbinfo KB918992
Comentários