[SPIKE][BAYMAX] - Migração de usuários e senhas de banco de dados SQL Server
Transferir logons e senhas entre instâinstâncias do SQL Server
Este artigo descreve como transferir os logons e as senhas entre diferentes instâinstâncias do SQL Server em execuçãexecução no Windows.
VersãVersão do produto original: SQL ServerNúNúmero do KB original: 918992
IntroduçãIntrodução
Este artigo descreve como transferir os logons e senhas entre diferentes instâinstâncias do Microsoft SQL Server.
ObservaçãObservação
As instâinstâncias podem estar no mesmo servidor ou em servidores diferentes e suas versõversões podem ser diferentes.
Mais informaçõinformações
Neste artigo, o servidor A e o servidor B sãsão servidores diferentes.
Depois de mover um banco de dados da instâinstância do SQL Server no servidor A para a instâinstância do SQL Server no servidor B, os usuáusuários podem nãnão conseguir fazer logon no banco de dados no servidor B. AléAlém disso, os usuáusuários podem receber a seguinte mensagem de erro:
Falha de logon para o
usuáusuário 'MyUser'. (Microsoft SQL Server, erro: 18456)
Esse problema ocorre porque vocêvocê nãnão transferiu os logons e as senhas da instâinstância do SQL Server no servidor a para a instâinstância do SQL Server no servidor B.
ObservaçãObservação
A mensagem de erro 18456 tambétambém ocorre devido a outros motivos. Para obter informaçõinformações adicionais sobre essas causas e possípossíveis revisõrevisões de resoluçõresoluções MSSQLSERVER_18456.
Para transferir os logons, use um dos seguintes mémétodos, conforme apropriado para a sua situaçãsituação.
-
MéMétodo 1: redefinir a senha no computador SQL Server de destino (servidor B)Para resolver esse problema, redefina a senha no computador do SQL Server e
façfaça o script do logon.ObservaçãObservaçãoO algoritmo de hash de senha
éé usado quandovocêvocê redefine a senha. -
MéMétodo 2: transferir logons e senhas para o servidor de destino (servidor B) usando scripts gerados no servidor de origem (servidor A)-
Criar procedimentos armazenados que
irãirão ajudar a gerar scriptsnecessánecessários para transferir logons e suas senhas. Para fazer isso, conecte-se ao servidor A usando o SQL Server Management Studio (SSMS) ou qualquer outra ferramenta de cliente e execute o seguinte script:SQLUSE 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
ObservaçãObservaçãoEsse script cria dois procedimentos armazenados no banco de dados mestre. Os procedimentos
sãsão nomeados sp_hexadecimal e sp_help_revlogin . -
No editor de consulta SSMS, selecione a
opçãopção resultados para texto . -
Execute a seguinte
instruçãinstrução no mesmo ou em uma nova janela de consulta:SQLEXEC sp_help_revlogin
-
O script de
saísaídasp_help_revlogin
gerado pelo procedimento armazenadoéé o script de logon. Esse script de logon cria os logons quetêtêm o identificador desegurançsegurança (SID) original e a senha original.
-
Importante
Revise as informaçõinformações na seçãseção comentácomentários abaixo antes de prosseguir com a implementaçãimplementação de etapas no servidor de destino.
Etapas no servidor de destino (servidor B)
Conecte-se ao servidor B usando qualquer ferramenta de cliente (como SSMS) e execute o script gerado na etapa 4 (saísaída de sp_helprevlogin
) do servidor A.
ComentáComentários
Revise as seguintes informaçõinformações antes de executar o script de saísaída na instâinstância no servidor B:
-
Uma senha pode ser codificada das seguintes maneiras:
VERSION_SHA1
: Esse hashéé gerado usando o algoritmo SHA1 eéé usado no SQL Server 2000 por meio do SQL Server 2008 R2.VERSION_SHA2
: Esse hashéé gerado usando o algoritmo SHA2 512 eéé usado no SQL Server 2012 e emversõversões posteriores.
-
Revise o script de
saísaída cuidadosamente. Se o servidor A e o servidor B estiverem emdomídomínios diferentes,vocêvocêprecisaráprecisará alterar o script desaísaída. Em seguida,vocêvocê precisa substituir o nome dedomídomínio original usando o novo nome dedomídomínio nasinstruçõinstruções CREATE LOGIN. Os logons integrados que recebem acesso no novodomídomínionãnãotêtêm o mesmo SID que os logons nodomídomínio original. Portanto, osusuáusuários ficamórfãórfãos desses logons. Para obter maisinformaçõinformações sobre como resolver essesusuáusuáriosórfãórfãos, consulte como resolver problemas depermissãpermissão ao mover um banco de dados entre servidores queestãestão executando o SQL Server.Se o servidor A e o servidor B estiverem no mesmo
domídomínio, o mesmo SIDseráserá usado. Portanto,ééimprováimprovável que osusuáusuários fiquemórfãórfãos. -
No script de
saísaída, os logonssãsão criados usando a senha criptografada. Isso se deve ao argumento HASH naCREATE LOGIN
instruçãinstrução. Este argumento especifica que a senha inseridaapóapós o argumento PASSWORDjájáéé hash. -
Por
padrãpadrão, apenas um membro dafunçãfunção de servidor fixa sysadmin pode executar umaSELECT
instruçãinstrução dosys.server_principals
modo deexibiçãexibição. A menos que um membro dafunçãfunção de servidor fixa sysadmin conceda aspermissõpermissõesnecessánecessárias aosusuáusuários, osusuáusuáriosnãnão podem criar ou executar o script desaísaída. -
As etapas neste artigo
nãnão transferem asinformaçõinformações de banco de dadospadrãpadrão para um determinado login. Isso ocorre porque o banco de dadospadrãpadrão podenãnão existir sempre no servidor B. Para definir o banco de dadospadrãpadrão para um logon, use aALTER LOGIN
instruçãinstrução passando o nome de logon e o banco de dadospadrãpadrão como argumentos. -
Ordenar pedidos nos servidores de origem e de destino:
-
Servidor que
nãnão diferenciamaiúmaiúsculas deminúminúsculas e servidor B: a ordem declassificaçãclassificação do servidor a pode diferenciarmaiúmaiúsculas deminúminúsculas, e a ordem declassificaçãclassificação do servidor B pode diferenciarmaiúmaiúsculas deminúminúsculas. Nesse caso, osusuáusuários devem digitar as senhas em todas as letrasmaiúmaiúsculas depois quevocêvocê transferir os logons e as senhas para ainstâinstância no servidor B. -
Servidor que diferencia
maiúmaiúsculas deminúminúsculas e servidor B: A ordem declassificaçãclassificação do servidor A pode diferenciarmaiúmaiúsculas deminúminúsculas, e a ordem declassificaçãclassificação do servidor B pode diferenciarmaiúmaiúsculas deminúminúsculas. Nesse caso, osusuáusuáriosnãnão podem fazer logon usando os logons e as senhas quevocêvocê transfere para ainstâinstância no servidor B, a menos que uma das seguintescondiçõcondições seja verdadeira:- As senhas originais
nãnãocontêcontêm letras. - Todas as letras nas senhas originais
estãestão em letrasmaiúmaiúsculas.
- As senhas originais
-
Diferenciar
maiúmaiúsculas deminúminúsculas ou diferenciarmaiúmaiúsculas deminúminúsculas em ambos os servidores: a ordem declassificaçãclassificação do servidor a e do servidor b pode diferenciarmaiúmaiúsculas deminúminúsculas, ou a ordem declassificaçãclassificação do servidor a e do servidor b pode diferenciarmaiúmaiúsculas deminúminúsculas. Nesses casos, osusuáusuáriosnãnão enfrentam um problema.
-
-
Um logon que
jájáestáestá nainstâinstância no servidor B pode ter um nome igual ao nome do script desaísaída. Nesse caso,vocêvocêreceberáreceberá a seguinte mensagem de erro quando executar o script desaísaída nainstâinstância no servidor B:MSG 15025,
nínível 16, estado 1, linha 1
A entidade desegurançsegurança do servidor 'MyLogin'jájá existe.Da mesma forma, um logon que
jájáestáestá nainstâinstância no servidor B pode ter um SID queéé o mesmo que um SID no script desaísaída. Nesse caso,vocêvocêreceberáreceberá a seguinte mensagem de erro quando executar o script desaísaída nainstâinstância no servidor B:MSG 15433,
nínível 16, estado 1, linha 1 oparâparâmetro fornecido por Sidestáestá em uso.Portanto,
vocêvocê deve fazer o seguinte:-
Revise o script de
saísaída cuidadosamente. -
Examine o
conteúconteúdo do modo deexibiçãexibição sys.server_principals nainstâinstância no servidor B. -
Solucionar essas mensagens de erro conforme apropriado.
No SQL Server 2005, o SID de um logon
éé usado para implementar o acesso nonínível do banco de dados. Um logon pode ter diferentes SIDs em diferentes bancos de dados em um servidor. Nesse caso, o logonsósó pode acessar o banco de dados que tem o SID que corresponde ao SID nosys.server_principals
modo deexibiçãexibição. Esse problema pode ocorrer se os dois bancos de dados forem combinados de servidores diferentes. Para resolver esse problema, remova manualmente o logon do banco de dados que tem uma incompatibilidade de SID usando ainstruçãinstrução DROP USER. Em seguida, adicione o logon novamente usando aCREATE USER
instruçãinstrução.
-